我应该在哪里放置AngularJS范围$ watchers?

时间:2013-04-17 06:31:44

标签: angularjs angularjs-scope

我正在尝试更改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'
    };
});

此处item1items数组中出现两次,因此我最终得到两个控制器观看同一条数据。如果triggers是对属性的更改,并且catches已保存回服务器,那么我将每次更改保存到item1两次。如果一个项目出现三次,它将节省三次。

我觉得更改侦听器应该放在模型中,但模型没有任何访问范围的权限。迭代每个项目并在AppCtrl中添加行为对我来说没有多大意义。那么观察者去哪儿了?

我在这里也把它放在一个小提琴中:http://jsfiddle.net/nicholasstephan/p56MT/3/

由于

1 个答案:

答案 0 :(得分:0)

我没有像你在这里那样使用指令中指定的控制器,但另一种方法是在项目指令中设置监视。这样,手表只会在指令中更改项目时触发一次。