我正在尝试更改 AngularJS 范围以触发模型中的操作。为此,我$scope.$watch()
在我的项目控制器中使用,并将这些控制器插入指令中。我遇到的问题是,当一个项目在页面上出现多次时,我会为同一条数据获得多个观察者。
例如:
angular.module("MyApp", [])
.factory('ItemsModel', function() {
var item1 = { triggers: 0, catches: 0 };
var item2 = { triggers: 0, catches: 0 };
return {
getItems: function() {
return [item1, item2, item1];
}
};
})
.controller('AppCtrl', function($scope, ItemsModel) {
$scope.items = ItemsModel.getItems();
})
.controller('ItemCtrl', function($scope) {
$scope.trigger = function() {
$scope.item.triggers++;
};
$scope.$watch('item.triggers', function(newValue, oldValue) {
if(newValue != oldValue)
$scope.item.catches++;
});
})
.directive('item', function() {
return {
scope: {
item: "="
},
controller: 'ItemCtrl'
};
});
这里item1
在数组中出现了两次items
,所以我最终得到了两个控制器查看同一条数据。如果triggers
对属性进行了更改,并将catches
其保存回服务器,那么我会将每个更改保存到 item1 两次。如果一个项目出现 3 次,它会节省 3 次。
我觉得更改侦听器应该进入模型,但模型无权访问范围。迭代每个项目并在 AppCtrl 中添加行为对我来说没有多大意义。那么观察者去哪儿了呢?
我也把它放在了这里:http: //jsfiddle.net/nicholasstephan/p56MT/3/
谢谢