2015-06-09 19 views
5

Ho problemi nell'iniettare $ compilare nella seguente direttiva.

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); 
    } 
} 

Al momento il lancio di $ compilazione è un errore non definito. Ho provato a utilizzare

static $inject = ['$compile']; 

Ma per qualche motivo scompare dallo script transpiled.

Here è il codice completo utilizzato.

risposta

0

Quindi ho trovato un modo per farlo funzionare ma non è elegante come avrei voluto.

angular.module('formDirectives', [], function($compileProvider){ 
    $compileProvider.directive('catElement', ($compile) => { 
     return new Element($compile); 
    }); 
}) 
9

Includere il static $inject e un 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

Per registrarsi questa direttiva con angolare, questo è quello che faccio sempre (ci sono più soluzioni):

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; 
    } 
} 

e per registrarsi:

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

Come registrare questa direttiva con angolare, in quanto il costruttore richiede un parametro? Inoltre ho implementato il modo in cui hai specificato, ma sto ottenendo un $ compilare non è un errore di funzione. – Rockroxx

+0

Angular utilizza l'iniezione delle dipendenze, quindi il costruttore si risolverà da solo. Devi usare il puntatore sul controller per ottenere la variabile $ compile privata: 'this. $ Compile' – devqon

+0

Sembra che il seguente: static $ inject = ['$ compile']; Costruttore (private $ compile: ng.ICompileService) {} link pubblico = (scope: dirScopeInterface, elemento: any, attrs: ng.IAttributes, formCtrl: ng.IFormController) => { scope.tempForm = formCtrl; var attr = this.arrayJoiner (scope.standard, scope.attrs || {}, scope.ignore || {}); element.html (this.compiler (attr)); . $ Compile (element.contents()) (scope); } Angolare genera un $ non un errore di compilazione. – Rockroxx

Problemi correlati