2015-12-14 10 views
9

Ich benutze die v1.5-Komponente, die im Wesentlichen (soweit ich verstehe) ein Wrapper für Best Practice-Anweisungen ist. http://toddmotto.com/exploring-the-angular-1-5-component-method/Zugriff auf Attribute in Angularjs 'v1.5-Komponente?

Ich habe folgendes:

<span>Correclty showing: {{ data.type }}</span> 
<book class="details" type="data.type"></book> 

Und es ist Komponentendefinition:

angular 
.module('app') 
.component('book', { 
    bindings: { 
     type: '=' 
    }, 
    template: function($element, $attrs) { 
     // Have tried A): 
     // console.log($attrs.type); // <- undefined 

     // And B): 
     $attrs.$observe('type', function(value) { 
      console.log(value); // <- undefined 
     }); 

     // But.. C): 
     return "This works though {{ book.type }}"; // <- renders 
    } 
}); 

Sowohl A) und B)

Weitere Informationen über die Version 1.5 der Komponente finden sich hier Variationen zurück undefined. C) wird richtig gerendert.

Gibt es eine Möglichkeit, auf Attribute innerhalb der Template-Funktion zuzugreifen, bevor die Template-Zeichenkette zurückgegeben wird?

Antwort

13

In 1.5 nimmt templateUrl jetzt injectables gemäß der Dokumentation: https://docs.angularjs.org/guide/component. Wenn Sie ng-srict-di verwenden, erhalten Sie einen Fehler, es sei denn, Sie spezifizieren die injizierbaren .... Ich benutze ng-annotate, um die Kopfschmerzen zu speichern und den Code sauber zu halten. Hier ist ein Beispiel (in Typoskript):

import IRootElementService = angular.IRootElementService; 
    import IAttributes = angular.IAttributes; 

    angular.module('app').component('book', { 

     /*@ngInject*/ 
     templateUrl($element:IRootElementService, $attrs:IAttributes) { 
      // access to the $element or $attrs injectables 
     } 

    }); 

oder ohne ng-annotate in Vanille JS:

angular.module('app').component('book', {  
     templateUrl: ['$element', '$attrs', function($element, $attrs) { 
      // access to the $element or $attrs injectables 
     }], 
    }); 
+0

Ich sehe ng-strict-di, ng-Anmerkungen versehen und dann eine sehr interessante @ ngInject? Können Sie erklären, wie ein Attr injizierbar sein kann? Ich suche nach einer Antwort, die vorschlägt, wie man das templateUrl basierend auf anderen Abhängigkeiten erstellt. – iJames

+0

Es ist in der Angular 1.5 docs, in der Komponentenarchitektur sind $ Element und $ Attrs injizierbar. Weitere Informationen finden Sie im Komponentenhandbuch, das in der Antwort verlinkt ist. – Jeff

+1

@Jeff ist es notwendig, den $ Element-Dienst zu injizieren? Ich habe versucht, ohne es zu injizieren und es scheint trotzdem zu funktionieren. – user449689