2013-06-21 44 views
0

我有兩個控制器,添加項目和刪除項目,以及模型顯示所有項目。 該模型注入到控制器中(在相同的模板上工作)。AngularJS:處理控制器中的模型數據注入

每當添加一個項目時,我廣播一條消息,該消息由Model收聽,並從服務器重新加載數據。

代碼:

ItemModule.factory('ItemListModal', function ($resource, $rootScope){ 
    var allItem = $resource('item/page/:pageId.json', {'pageId': pageId }); 
    var items = allItem.query(); 
    $rootScope.$on('ItemAdded',function(){ 
     items = allItem.query(); 
    }); 
    return items; 
}); 

//Item is another Model, used to send data on server. 
function CreateItemCtrl($scope, $rootScope, Item) { 
    $scope.save = function() { 
    Item.save($scope.item, function(data) { 
         $scope.result = data; 
         $rootScope.$broadcast('ItemAdded'); 
        }, function(data) { 
         $scope.result = data.data; 
     }); 
    } 
} 

function ListItemCtrl($scope, ItemListModal) { 
    $scope.allItems = ItemListModal; 
} 

問題:現在,因爲當第一次加載模板上添加項目它只會改變模式,但這不是重新注入ListItemCtrl上ListItemCtrl的依賴已經解決。由於這個原因,模板上的列表不會改變。

有什麼辦法可以告訴AngularJS重新解析控制器的依賴關係嗎?

我真的不想監聽控制器中的事件並重新查詢數據,因爲還有其他控制器也需要來自服務器的相同數據。

回答

1

添加間接的另一個層面上,你從你的服務回報什麼。

ItemModule.factory('ItemListModal', function ($resource, $rootScope){ 
    var allItem = $resource('item/page/:pageId.json', {'pageId': pageId }); 
    var data = {items:allItem.query()}; 
    $rootScope.$on('ItemAdded',function(){ 
     data.items = allItem.query(); 
    }); 
    return data; 
}); 


function ListItemCtrl($scope, ItemListModal) { 
    $scope.allItems = ItemListModal; 
    // use as $scope.allItems.items wherever you need it. It will update when changes occur. 
} 

但它可能會更好,讓客戶端上的項目列表的規範表示,並努力保持電流當你添加的東西(只是把它保存在服務器悄悄地)。

+0

它的工作,謝謝。你能否解釋一下,爲什麼它通過添加另一個間接方式以這種方式工作? –

+0

每次調用allItem.query()時,都會返回對其他對象的引用。如果將第一個對象放在作用域中,則第二個對象不會自動替換它。如果您返回一個指向第一個對象的對象,那麼稍後將該對象修改爲指向第二個對象,那麼您的容器對象將始終處於最新狀態。我希望這有幫助,現在我重讀它聽起來很混亂。 –

+0

明白了!謝謝! –

0

這個問題似乎是,儘管項目得到更新(有你在$試過的console.log?)這不是一個對象,所以沒有被引用過。如果你在你的業務切換到這一點:

ItemModule.factory('ItemListModal', function ($resource, $rootScope){ 
    var ItemListModalScope = this; 
    var allItem = $resource('item/page/:pageId.json', {'pageId': pageId }); 
    ItemListModalScope.items = allItem.query(); 
    $rootScope.$on('ItemAdded',function(){ 
     ItemListModalScope.items = allItem.query(); 
    }); 
    return ItemListModalScope; 
}); 

然後無論你在你的圓頂使用allItems,你會做

{{ allItems.items }} 
+0

什麼是{{allItems.list}},我們從未在'list'中保存任何內容。你的意思是{{allItems.items}}?如果是這樣,那是行不通的。我在$ on上做了console.log,數據來自服務器。問題是它沒有被重新注入ListItemCtrl。任何想法? –

相關問題