Im obigen Beispiel, wenn ich das Wert-Array an die Direktive vom Controller übergeben, werden alle Änderungen in der Direktive html widergespiegelt. Ich meine, ich kann die Änderungen in der Benutzeroberfläche sehen.Angular Binding funktioniert nicht in benutzerdefinierten Direktive für lokalen Bereich Variablen mit übergebenen Daten berechnet
Aber Veränderungen im Wert von $scope.message
Variable reflektiert nicht erhalten, auch wenn der Wert von $scope.message
aus dem Wert von $scope.myData
, deren Wert berechnet wird, ändert sich immer $timeout
in der übergeordneten Steuerung mit , jene Änderungen zu sehen $scope.message
, müssen Sie das Array mit $watchCollection
überwachen. Meine Fragen sind,
- Warum eckige Bindung funktioniert nicht für
$scope.myData
normalerweise? - Was sind andere "bekannte" Fälle, in denen die Bindung von Winkeln nicht funktioniert?
Unten ist der Code-Schnipsel
(function(){
angular.module("csjoshi04.2waybinding",[])
.controller("ParentCtrl",["$scope", "$timeout", function($scope, $timeout){
$scope.myCars = ["Ford", "BMW", "Toyata"];
$timeout(function(){
$scope.myCars.push("Honda");
}, 3000);
}])
.directive("showMyData",function(){
return {
restrict: "E",
scope: {
myData : "="
},
controller : ["$scope", function($scope){
$scope.message = ($scope.myData.indexOf("Honda") > -1 && $scope.myData.length >= 4) ? "1 out of 4 cars is always Honda": "OOPS, no honda cars";
}],
template : '<div>{{message}}</div><ul ng-repeat="data in myData"><li>{{data}}</li></ul>'
}
})
})()
Below html
ist<body ng-controller="ParentCtrl"><show-my-data my-data="myCars" ></show-my-data></body>
Um oben genannten Richtlinie funktioniert, ich unten ändert
directive("showMyData",function(){
return {
restrict: "E",
scope: {
myData : "="
},
controller : ["$scope", function($scope){
$scope.message = ($scope.myData.indexOf("Honda") > -1 && $scope.myData.length >= 4) ? "1 out of 4 cars is always Honda": "OOPS, no honda cars";
$scope.$watchCollection(function(){
return $scope.myData;
}, function(new1, old){
$scope.message = ($scope.myData.indexOf("Honda") > -1 && $scope.myData.length >= 4) ? "1 out of 4 cars is always Honda": "OOPS, no honda cars";
});
}],
template : '<div>{{message}}</div><ul ng-repeat="data in myData"><li>{{data}}</li></ul>'
}
})
hier gemacht ist der Link zu plunkr.
das ist eine wirklich gute Lösung.Es hilft auch, $ scope nicht zu verwenden. $ Watch/Collection. Eine Frage, in diesem Problem, warum eine Getter-Funktion immer ausgewertet wird, während Nachricht nicht? – csjoshi04
Beide werden ausgewertet. Mit '$ scope.message' wird der Controller-Code einmal ausgeführt und' $ scope.message' wird "OOPS, keine Honda-Autos", denn wenn es läuft, gibt es keine hondas. Angular überprüft weiterhin, was der Wert von $ scope.message ist, aber es wird sich nicht ändern. Angular kann nicht auf Ihren Code '$ scope.message = ($ scope.myData.indexOf (" Honda ") ...' zugreifen oder diesen wiederverwenden ..... Dieser indexOf-Check wird einmal ausgeführt und dann ist es weg, nur das Ergebnis wird angezeigt " – noppa
So funktionieren Anweisungen in vielen Programmiersprachen. Aber Funktionen sind anders. Der Code in ihnen kann und wird so oft wie wir wollen neu bewertet werden. Anders als mit der einfachen Nachricht." value, angular kann die Funktion immer wieder aufrufen und sie auffordern, den Wert neu zu bewerten – noppa