2016-07-20 9 views
1

Mein Ziel ist es, einen Initialisierungscode für materialize-css innerhalb eines Aurelia-Projekts auszuführen. I have a related question on this matter, aber es wurde nie gelöst. Das Problem ist folgendes: Ich Typoskript benutze und bisher nicht in der Lage gewesen, Funktionen auszuführen, wie:Wie kann ich eine Definitionsdatei in Typoskript für eine Javascript-Datei schreiben?

$('slider').slider; 

So entschied ich, diese in einer Javascript-Datei (die die materialisieren Richtlinien aus dem Import sieht in index.html) und legen Sie eine Definitionsdatei oben drauf. Als ich versuchte, die Deklarationsdatei zu schreiben, folgte ich den an typescriptlang.org Anweisungen und schrieb dazu:

module initializers { 
    function setUpHome(): void; 
} 

declare module "initializers" { 
    export = initializers; 
} 

Aber ich erhalte den folgenden Fehler:

A 'declare' modifier is required for a top level declaration in a .d.ts file 

Ich würde jede Führung appretiate.

EDIT: Funktion setUpHome

function setUpHome() { 
    console.log("hello"); 
    $('.slider').slider(); 
    $('select').material_select(); 
    $('.button-collapse').sideNav(); 

    var slider = document.getElementById('wordCountSlider'); 
    noUiSlider.create(slider, { 
     start: [0, 6000], 
     connect: true, 
     step: 50, 
     range: { 
     'min': 0, 
     'max': 6000 
     }, 
     format: wNumb({ 
     decimals: 0 
     }) 
    }); 

    slider = document.getElementById('timeRangeSlider'); 
    noUiSlider.create(slider, { 
     start: [0, 5], 
     connect: true, 
     step: 1, 
     range: { 
     'min': 0, 
     'max': 5 
     }, 
     format: wNumb({ 
     decimals: 0 
     }) 
    }); 
    setUpTagSearchFilter(); 
}; 

function setUpTagSearchFilter() { 
    var cities = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('text'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    prefetch: 'assets/cities.json' 
    }); 
    cities.initialize(); 

    var tagfilter = $('#tag-filter'); 
    tagfilter.materialtags({ 
    itemValue: 'value', 
    itemText: 'text', 
    typeaheadjs: { 
     name: 'cities', 
     displayKey: 'text', 
     source: cities.ttAdapter() 
    } 
    }); 
    tagfilter.materialtags('add', { "value": 1 , "text": "Amsterdam" , "continent": "Europe" }); 
    tagfilter.materialtags('add', { "value": 4 , "text": "Washington" , "continent": "America" }); 
    tagfilter.materialtags('add', { "value": 7 , "text": "Sydney" , "continent": "Australia" }); 
} 

Antwort

2

My ultimate goal is to execute some initialization code for materialize-css inside an aurelia project. I have a related question on this matter, but it was never solved. The problem is the following: I am using typescript, and have so far been unable to execute functions such as:

$('slider').slider

Eigentlich gibt es keinen Grund, Typoskript Sie tun dies halten würde. Es ist schwierig zu verstehen, welches Problem Sie haben, da "nicht ausführbar" mehr Informationen benötigt (wie die Fehlermeldung), um zu diagnostizieren.

Meine Vermutung ist, du meinst VSCode/Visual Studio gibt dir "rote Squigglies." Wenn dies der Fall ist, bedeutet dies nur, dass die Typisierung nicht installiert wurde. Wenn Sie mit dem typings cli vertraut sind, dann werden Sie nur materialisieren Typisierungen installieren müssen:

typings install dt~materialize-css --global --save

Edit:

In den Kommentaren Sie eine neue Fehlermeldung hervorgehoben, die eigentlich repräsentiert ein ganz anderes Problem.

Error TS2339: Property 'slider' does not exist on type 'ElementFinder.

Was dies bedeutet, ist, dass $ in Ihrem Code Protractor ist, nicht jQuery. Sie müssen sicherstellen, dass Sie alle Verweise auf den Winkelmesser d.ts in Ihrem nicht testenden Code ausschließen. Ich bin mir nicht sicher, wo die Winkelmesser-Typen sind, also musst du nach ihnen suchen.Wenn sie über Typisierungen installiert sind:

typings remove dt~angular-protractor

+0

Sie hatten Recht, das Problem waren die roten Squigglies. Ich habe die Typinstallationen ausgeführt, dann den Typisierungsordner überprüft und die Installation (oder so scheint es) ist erfolgreich verlaufen. Die roten Squigglies und der Konsolenfehler: Fehler TS2339: Property 'Slider' existiert nicht auf Typ 'ElementFinder. Immer noch bestehen. Sollte ich zusätzliche Importe in die Typoskript-Datei einschließen, wo ich die materialize-Funktionen anrufe? Danke für die Hilfe. –

+0

Es ist super schwer zu sagen. Wenn ich das [dts] (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/72c15a7cb356aa85b19d3f144f0cbb334818f78/materialize-css/materialize-css.d.ts#L398) ansehe, denke ich, dass das dts für jquery 2 und dich geschrieben wurde benutze jquery 3. Probiere das aus. Auch Upvote für Anstrengung? –

+0

Ok, du hast mir wenigstens in die (scheinbar) richtige Richtung gezeigt. Ich werde eine separate Frage zu diesem Thema öffnen. –

2

Der Fehler sagt einfach, dass Sie zunächst ein Modul deklarieren müssen und dann sind Sie in der Lage, es zu benutzen. Sie können in einem Ein-Schritt beides tun:

declare module initializers { 
    export function setUpHome(): void; 
} 

Es ist auch eine gute Idee, wenn Sie to turn strict mode on ECMAScript 5. Weiterhin im Auge verwenden, halten die internen Module sind Namespaces seit Typoskript 1.5 und es ist eine gute Idee um es dann als Namespace zu deklarieren. Zitat aus TypeScript doc:

A note about terminology: It’s important to note that in TypeScript 1.5, the nomenclature has changed. “Internal modules” are now “namespaces”. “External modules” are now simply “modules”.

Um es zusammenzufassen würde ich mit diesem gehen:

declare namescpace initializers { 
    'use strict'; 

    export function setUpHome(): void; 
} 
+0

Das einzige, was ich nicht klar bin, ist, wie zu importieren und die Funktion in einer anderen Datei zu verwenden. Soll ich das tun: /// Oder verwenden Sie eine Import/require-Anweisung und/oder weisen Sie die Funktion einer Variablen zu? Ich bin neu in Typoskript und kann diese Information nicht finden. Danke –

+0

@Der Lichtbringer Ja, '/// ' ist korrekt. Stellen Sie sicher, dass Sie einen echten Pfad zu einer Datei verwenden. Sie können eine Funktion dann wie folgt verwenden: 'initializers.setUpHome();'. –

+0

Das Problem ist, dass mit /// und dann wie folgt aufrufen: initializers.setUpHome(); gibt mir 'Aurelia-Logging-console.js: 54 Fehler [App-Router] Fehler: Fehler beim Aufruf von Home.' (Home ist das Ansichtsmodul, das die Funktion aufruft). Die Fehlerausgabe bezieht sich auf die Bibliotheken von aurelia und liefert keine Informationen. Es tut mir leid, Sie weiterhin zu belästigen, aber ich kann keine weiteren Informationen zu diesem Thema finden. –