在上面的示例中,當我更改從控制器傳遞給指令的值數組時,所有更改都反映在指令html中。我的意思是我可以看到UI中的變化。在使用傳遞數據計算的本地作用域變量的自定義指令中,角度綁定不起作用
但$scope.message
變量的值的變化沒有得到體現,即使正在從$scope.myData
值,在父控制器使用$timeout
是得到改變其值計算的$scope.message
值 要看到這些變化$scope.message
,您需要使用$watchCollection
來觀看陣列。我的問題是,
- 爲什麼angular的綁定在
$scope.myData
正常情況下不起作用? - 角度綁定不起作用的其他「已知」角落案件是什麼?
下面的代碼片段
(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。$ watch/Collection。一個問題,但在這個問題,爲什麼getter函數總是得到評估,而消息不是? – csjoshi04
他們都得到評估。 使用'$ scope.message'控制器代碼將運行一次,'$ scope.message'將是「OOPS,沒有本田汽車」,因爲它運行時沒有本金。 Angular將繼續檢查'$ scope.message'的值是什麼,但不會改變。 Angular無法訪問或重新使用你的代碼'$ scope.message =($ scope.myData.indexOf(「Honda」)...'。 那indexOf檢查會運行一次然後它不見了,只是結果得到分配給'message',而不是整個語句 – noppa
這就是語言在許多編程語言中的工作方式,但函數是不同的,它們內部的代碼可以並且會根據需要重新評估,與簡單的消息不同值,角度可以一遍又一遍地調用函數,並要求它重新評估值。 – noppa