这是一个完全符合我要求的jsfiddle:http://jsfiddle.net/4evvmqoe/1/ (除了那些初始警报......有没有办法压制那些?)。
HTML:
<div ng-app="">
<div ng-controller="MyCtrl">
<div ng-repeat = "x in items">
<input type = "checkbox" ng-model = "x.bool"/>
{{x.label}}
</div>
</div>
</div>
JS:
function MyCtrl($scope) {
var CheckBox = function(label, fn){
this.label = label;
this.fn = fn;
this.bool = true;
}
$scope.items = [
new CheckBox("aaaa", function(){alert("aaa")}),
new CheckBox("bbbb", function(){alert("bbb")}),
new CheckBox("cccc", function(){alert("ccc")})
];
for (var i = 0; i< $scope.items.length; i++){
$scope.$watch('items['+i+']', function(newValue, oldValue){
newValue.fn();
}, true);
}
}
我关心的是我的手表代码:
for (var i = 0; i< $scope.items.length; i++){
$scope.$watch('items['+i+']', //<-- seriously?
function(newValue, oldValue){
newValue.fn();
}, true);
}
有更好的方法吗?
问题:
如何取消初始提醒?
$scope.$watch('items['+i+']',
真的是正确的方法吗?我的意思是它有效但是...我觉得有一些可怕的性能问题岌岌可危。
答案 0 :(得分:1)
修改监视以查看值是否已更改,只有在更改后才调用您的函数
$scope.$watch('items['+i+']', function(newValue, oldValue){
if(newValue !== oldValue){
newValue.fn();
}
}, true);
手表很贵,您可以摆脱$watch
并在复选框上使用ng-change
,而不是更高效的
例如
HTML:
<div ng-app="">
<div ng-controller="MyCtrl">
<div ng-repeat = "x in items">
<input type = "checkbox" ng-model = "x.bool" ng-change = "x.fn()"/>
{{x.label}}
</div>
</div>
</div>
JS:
function MyCtrl($scope) {
var CheckBox = function(label, fn){
this.label = label;
this.fn = fn;
this.bool = true;
}
$scope.items = [
new CheckBox("aaaa", function(){alert("aaa")}),
new CheckBox("bbbb", function(){alert("bbb")}),
new CheckBox("cccc", function(){alert("ccc")})
];
}
更简单!
的 DEMO 强>