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'
};
});
這裏item1
的items
陣列中出現兩次,所以我結束了兩個控制器觀看相同的數據塊。如果triggers
是屬性的更改,並且catches
被保存回服務器,那麼我會將每次更改保存到item1兩次。如果一件物品出現三次,則會節省三次。
我覺得更改偵聽器應該放在模型中,但模型無法訪問範圍。遍歷每個項目並在AppCtrl中添加行爲對我來說沒有多大意義。那麼觀察者去哪裏?
我也把這個小提琴這裏:http://jsfiddle.net/nicholasstephan/p56MT/3/
感謝
該指令應該用於可重用組件。它不是一個控制器的包裝器。一個指令和ng-controller的控制器參數是兩個不同的東西。他們不是一樣的。 – ganaraj
@ganarj好的。如果我取出空指令,並使用ng-controller,控制器仍然會被調用兩次以獲取同一段數據。 http://jsfiddle.net/vFtbL/1/問題是,$ scope。$ watch('item.triggers'...'go?]應該在哪裏? – nicholas
你能解釋一下,你正在嘗試的真實世界場景解決?這太抽象了。 – ganaraj