2013-04-17 65 views
1

我正在嘗試更改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/

感謝

+0

該指令應該用於可重用組件。它不是一個控制器的包裝器。一個指令和ng-controller的控制器參數是兩個不同的東西。他們不是一樣的。 – ganaraj

+0

@ganarj好的。如果我取出空指令,並使用ng-controller,控制器仍然會被調用兩次以獲取同一段數據。 http://jsfiddle.net/vFtbL/1/問題是,$ scope。$ watch('item.triggers'...'go?]應該在哪裏? – nicholas

+0

你能解釋一下,你正在嘗試的真實世界場景解決?這太抽象了。 – ganaraj

回答

0

我沒有用在指令中指定喜歡你這裏有控制器,但另一種方法是隻設置一個在關於項目的指令中觀看。通過這種方式,手錶只會在指令中的項目發生變化時觸發一次。