上記の例では、コントローラからのディレクティブに渡された値配列を変更すると、すべての変更がディレクティブhtmlに反映されます。つまり、UIの変更を見ることができます。渡されたデータを使用して計算されたローカルスコープ変数のカスタムディレクティブで角度バインディングが機能していない
しかし$scope.message
変数の値の変化は$scope.message
の値がでこれらの変更を確認するには、親コントローラ に$timeout
を使用して、値が変化しつつある$scope.myData
の値から計算されていても、反映されません。 $scope.message
の場合、$watchCollection
を使用して配列を監視する必要があります。私の質問は、
$scope.myData
では正常に動作しないのはなぜですか?- angleのバインディングが機能しない他の「既知の」コーナーケースは何ですか?以下は
以下のコードである
(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>'
}
})
})()
ディレクティブの仕事の上に作るためにHTML
<body ng-controller="ParentCtrl"><show-my-data my-data="myCars" ></show-my-data></body>
ですが、私は以下の作っここ
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>'
}
})
を変更へのリンクですplunkr。
これは本当に良い解決策です。また、$ scope/$ collectionを使用しない場合に役立ちます。しかし、この問題でゲッター関数が評価されるのに対し、メッセージが得られないのはなぜですか? – csjoshi04
両方とも評価されます。 '$ scope.message'ではコントローラコードが一度実行され、' $ scope.message'は "OOPS、honda cars"になります。なぜなら、実行されるとホンダは存在しないからです。 Angularは '$ scope.message'の値が何であるかをチェックし続けますが、変更されません。 Angularはあなたのコード '$ scope.message =($ scope.myData.indexOf(" Honda ")...'。。 にアクセスまたは再利用することはできません。そのindexOfチェックは一度実行され、 – noppa
これは、多くのプログラミング言語で文がどのように機能するのかということですが、関数は異なります。それらの中のコードは、必要な回数だけ再評価することができます。値は、角度は、値を再評価するように求める機能を繰り返し呼び出すことができます – noppa