2015-06-09 5 views
5

Ich habe Probleme beim Injizieren von $ kompilieren in der folgenden Direktive.

export class Element { 
    public link(scope:dirScopeInterface, element:any, attrs:ng.IAttributes, formCtrl:ng.IFormController) { 
     var attr = this.arrayJoiner(scope.standard, scope.attrs || {}, scope.ignore || {}); 
     element.html(this.compiler(attr)); 
     $compile(element.contents())(scope); 
    } 
} 

Im Moment ist es ein $ Kompilierung wirft undefiniert Fehler. Ich habe versucht mit

static $inject = ['$compile']; 

Aber es verschwindet aus dem transpiled Skript aus irgendeinem Grund.

Here ist der vollständige Code verwendet.

Antwort

0

Also habe ich einen Weg gefunden, es zum Laufen zu bringen, aber es ist nicht so elegant, wie ich es mir gewünscht hätte.

9

Fügen Sie die static $inject und ein constructor:

export class Element { 

    // $compile can then be used as this.$compile 
    constructor(private $compile: ng.ICompileService){}; 

    public link(scope:dirScopeInterface, element:any, attrs:ng.IAttributes, formCtrl:ng.IFormController) { 
     var attr = this.arrayJoiner(scope.standard, scope.attrs || {}, scope.ignore || {}); 
     element.html(this.compiler(attr)); 
     this.$compile(element.contents())(scope); 
    } 
} 

EDIT

diese Anweisung mit Winkel Um sich anzumelden, ist das, was ich immer tun (es gibt mehrere Lösungen):

export class Element implements angular.IDirective { 

    public static ID = "element"; 

    // This can then be removed: 
    // static $inject = ["$compile"]; 

    // .. 

    /** 
    * The factory function that creates the directive 
    */ 
    static factory(): angular.IDirectiveFactory { 
     const directive = ($compile) => new Element($compile); 
     directive.$inject = ["$compile"]; 
     return directive; 
    } 
} 

und zu registrieren:

angular.module("myModule" []) 
    .directive(Element.ID, Element.factory()); 
+0

Wie würde ich diese Anweisung mit eckigen dann registrieren, da der Konstruktor einen Parameter benötigt? Auch ich habe es so implementiert, wie Sie angegeben haben, aber ich bekomme eine $ Kompilierung ist kein Funktionsfehler. – Rockroxx

+0

Angular verwendet die Abhängigkeitsinjektion, damit der Konstruktor sich selbst auflöst. Sie müssen den Zeiger auf den Controller verwenden, um zur privaten $ compile-Variablen zu gelangen: 'this. $ Compile' – devqon

+0

Es sieht so aus: static $ inject = ['$ compile']; Konstruktor (private $ compile: ng.ICompileService) {} public link = (Bereich: dirScopeInterface, Element: any, attrs: ng.IAttributes, formCtrl: ng.IFormController) => { scope.tempForm = formCtrl; var attr = dieses.arrayJoiner (scope.standard, scope.attrs || {}, scope.ignore || {}); element.html (this.compiler (attr)); dies. $ Compile (element.contents()) (Bereich); } Angular wirft einen $ compile kein Funktionsfehler. – Rockroxx