2016-07-14 5 views
1

Ich versuche eine benutzerdefinierte eckige Komponente zu erstellen, die dynamisch eine Vorlage basierend auf einer templateUrl-Funktion lädt. Ich bekomme derzeit eine templateUrl verwendet keine explizite Annotation und kann nicht im strikten Modus 'Fehler aufgerufen werden. Normalerweise verstehe ich, dass dieser Fehler auftritt, wenn ein injizierter Dienst nicht richtig kommentiert wird (https://docs.angularjs.org/error/ $ injector/strictdi). Ich vermisse jedoch, wie dies für templateUrl gilt.Die Funktion templateUrl verwendet keine explizite Annotation und kann nicht im strikten Modus aufgerufen werden.

Ich benutze Angular 1.5.

Genaue Fehlermeldung - angular.js:13550 Error: [$injector:strictdi] templateUrl is not using explicit annotation and cannot be invoked in strict mode

Component-Code-Snippet:

angular.module('hive.triGrid') 
.controller('TriGridCellController', ['$element', '$attrs', function  ($element, $attrs) { 
    var $ctrl = this; 
}]) 
.component('triGridCell', { 
controller: 'TriGridCellController', 
templateUrl: function($element, $attrs) 
{ 
    var type = $attrs.cellType; 
    if(type.toUpperCase() == "ICON") 
    { 
     return "components/grid/cellTemplates/iconCell.tpl.html"; 
    } 
    else if(type.toUpperCase() == "CUSTOM") 
    { 
     return $attrs.cellTemplateUrl; 
    } 
    else 
    { 
     return "components/grid/cellTemplates/textCell.tpl.html"; 
    } 
}, 
//template:"<ng-include src='$ctrl.getTemplateUrl(z)'/>", 
bindings: { 
    cellData:'<', 
    cellType: '<', //See triGridRow and triGrid for config JSON format. 
    } 
}); 

EDIT: -Code nach Antwort angewendet wurde:

templateUrl: ['$element', '$attrs', function($element, $attrs) 
{ 
    var type = $attrs.cellType; 
    if(type.toUpperCase() == "ICON") 
    { 
     return "components/grid/cellTemplates/iconCell.tpl.html"; 
    } 
    else if(type.toUpperCase() == "CUSTOM") 
    { 
     return $attrs.cellTemplateUrl; 
    } 
    else 
    { 
     return "components/grid/cellTemplates/textCell.tpl.html"; 
    } 
}], 

Antwort

3

Wie gesagt in this answer, $element und $attrs sind injiziert in templateUrl functi auf, nicht nur als Argumente übergeben. Dies ist der Unterschied zwischen element Parametername (in link oder compile Funktionen) und $element lokale Abhängigkeit in DI-fähigen Funktionen, die Angular Dokumentation betont.

templateUrl Funktion ist invoked by injector in Komponenten, so dass alle anderen Dienste dort auch injiziert werden können, und es sollte richtig kommentiert werden.

+0

Aus irgendeinem Grund habe ich nicht daran gedacht, das auf die Komponenten-Setup-Funktionen anzuwenden. Das hat für mich funktioniert. – Joseph

+0

Dies ist ein Ersatz für die Funktion "Directive factory", also können Services überall dort eingefügt werden, wo sie benötigt werden. – estus

+0

Ein Problem, mit dem ich noch konfrontiert bin, ist, dass $ attrs.cellType den Rohtext aus meiner Vorlage zurückgibt, nicht den tatsächlichen Controllerwert, der übergeben werden sollte. Ich versuche, eine Vorlage basierend auf der Konfiguration aufzulösen, anstatt sie vorher festzulegen Text. In diesem Fall muss ich anfangen, in das Kompilieren und das Verbinden einzutauchen, sowie eine rohe Direktive zu verwenden? – Joseph

Verwandte Themen