Ich möchte, dass es klug genug ist, die Richtlinie wann zu aktualisieren $scope.some_prop Änderungen, da dies impliziert, dass es völlig andere Inhalte zeigen sollte.
Ich habe es so getestet, wie es ist, und es passiert nichts, die Verknüpfungsfunktion wird nicht einmal aufgerufen, wenn $scope.some_prop Änderungen. Gibt es eine Möglichkeit, dies zu erreichen?
Chandermani
Die Link-Funktion wird nur einmal aufgerufen, daher würde sie nicht direkt das tun, was Sie erwarten. Sie müssen eckig verwenden $watch um eine Modellvariable zu beobachten.
Diese Uhr muss in der Link-Funktion eingerichtet werden.
Wenn Sie einen isolierten Geltungsbereich für Richtlinien verwenden, wäre der Geltungsbereich
scope :{typeId:'@' }
In deiner Linkfunktion fügst du dann gerne eine Uhr hinzu
link: function(scope, element, attrs) {
scope.$watch("typeId",function(newValue,oldValue) {
//This gets called when data changes.
});
}
Wenn Sie keinen isolierten Bereich verwenden, verwenden Sie watch on some_prop
Ich arbeite an einem ähnlichen Problem wie der OP. Die AngularJS-Dokumentation impliziert, dass using = in scope: erstellt eine bidirektionale Bindung, dh Änderungen im untergeordneten Bereich werden auf den übergeordneten Bereich übertragen und umgekehrt – ist dies nicht der Fall? Ich muss in der Lage sein, eine Direktive anzuweisen, sich selbst vom übergeordneten Controller zu aktualisieren.
– Eno
16. April 2015 um 22:22 Uhr
@Eno Hast du das herausgefunden? Verwirrt mich echt!
Ist es schädlich, den Geltungsbereich von über 10000 Direktiven zu haben, die einen Geltungsbereich starten.
– Léon Pelletier
12. November 2015 um 21:18 Uhr
Ich habe festgestellt, dass die obige Lösung nicht funktioniert, wenn der Parameter ‘=’ verwendet, und ich untersuche sie.
– Micky
22. November 2017 um 11:19 Uhr
j8io
Was Sie versuchen, ist, die Eigenschaft des Attributs in der Direktive zu überwachen. Sie können die Eigenschaft von Attributänderungen mit beobachten $beobachten() folgendermaßen:
Denken Sie daran, dass ich hier die Funktion „compile“ in der Anweisung verwendet habe, weil Sie nicht erwähnt haben, ob Sie Modelle haben und ob dies leistungsempfindlich ist.
Wenn Sie Modelle haben, müssen Sie die ‘kompilieren‘ Funktion zu ‘Verknüpfung‘ oder verwenden ‘Regler‘ und um die Eigenschaft eines Modells zu überwachen, sollten Sie verwenden $watch()und nehmen Sie die eckigen {{}} Klammern aus der Eigenschaft, Beispiel:
Wenn Sie unter AngularJS 1.5.3 oder neuer arbeiten, sollten Sie erwägen, zu Komponenten statt zu Direktiven zu wechseln. Diese funktionieren sehr ähnlich wie Direktiven, aber mit einigen sehr nützlichen zusätzlichen Funktionen, wie z. B. $onChanges(changesObj), einem der Lebenszyklus-Hooks, der aufgerufen wird, wenn One-Way-Bindings aktualisiert werden.
app.component('conversation ', {
bindings: {
type: '@',
typeId: '='
},
controller: function() {
this.$onChanges = function(changes) {
// check if your specific property has changed
// that because $onChanges is fired whenever each property is changed from you parent ctrl
if(!!changes.typeId){
refreshYourComponent();
}
};
},
templateUrl: 'conversation .html'
});