2014-03-26 127 views
1

我在我的Angular應用程序中有一個內容控制器和一個頭控制器。內容控制器可以將項目添加到對象數組。標題控制器將這些項目放入導航中。

加載時,頭控制器成功從數據庫加載現有項目並將它們添加到全局範圍,然後通過ng重複顯示在導航欄中。

當內容控制器將新項目添加到全局範圍時,雖然它未反映在標題中。我可以註銷全局範圍的內容,並且新項目在那裏,它只是不想在dom中顯示。使用$ apply()似乎沒有任何區別。

這裏的2個控制器:

HeaderCtrl:

angular.module('system').controller('HeaderController', ['$scope', 'Global', 'Lists', function ($scope, Global, Lists) { 
$scope.global = Global; 
    $scope.find = function() { 
     Lists.query(function(lists) { 
      $scope.global.lists = lists; 
     }); 
    }; 
}]); 

ContentCtrl:

angular.module('lists').controller('ListsController', ['$scope', '$routeParams', '$location', '$http', 'Global', 'Lists', function ($scope, $routeParams, $location, $http, Global, Lists) { 
    $scope.global = Global; 

    $scope.create = function() { 
     var list = new Lists({ 
      name: this.name, 
     }); 

     list.$save(function(response) { 
      $location.path('lists/' + response._id); 
      $scope.global.lists.push(response); 
     }); 
    }; 
}]); 

就像我說從標題控制器控制檯日誌顯示,新產品出現在$ scope.global.lists,但不會反映在DOM中。有任何想法嗎?

+0

爲什麼你有兩個獨立的模塊? – link64

+0

您能否包含相關的html(包含'ng-repeat'的位? –

+0

)它們是2個獨立的模塊,因爲我使用MEAN堆棧作爲項目的基礎。將來我可能會合並2個,但目前它使事情有點整齊,沒有太多的功能重疊。 –

回答

2

使用$rootScope事件,並抓住它的頭,只要你更新其他控制器:

//main ctrl 
$rootScope.$broadcast("updateHeader", someInfoToSend); 


//header ctrl 
$scope.$on("updateHeader", function(e, someInfoReceived){ 
    // do the necessary updates here 
}); 
0

這是現有的項目,並且是造成這一問題的新添加的項目之間的一個小的數據不匹配。

從數據庫的項目有中

owner: { 
    "_id" : "213876512461" 
} 

屬性而來自新項目的加入返回的數據有

owner: "213876512461" 

因爲這一個NG-hide指令的不正確隱藏新添加的項目。

我已經標記了ruedamanuel的答案,因爲我已經結束了使用$ broadcast方法讓主控制器在頭控制器中更新$ scope.lists,否定了使用$ rootScope或全局變量的需要。