我的Angular应用程序中有一个内容控制器和一个标题控制器。内容控制器能够将项添加到对象数组。标题控制器将这些项目放入导航中。
加载时,标题控制器成功加载数据库中的现有项目并将它们添加到全局范围,然后由于ng-repeat而显示在导航中。
当内容控制器将新项添加到全局范围时,虽然它没有反映在标题中。我可以注销全局范围的内容,新项目就在那里,它只是不想显示在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);
});
};
}]);
就像我说来自Header Controller的控制台日志显示新项目存在于$ scope.global.lists中但它没有反映在DOM中。有什么想法吗?
答案 0 :(得分:2)
使用$rootScope
事件,并在更新其他控制器时在标题中捕获它:
//main ctrl
$rootScope.$broadcast("updateHeader", someInfoToSend);
//header ctrl
$scope.$on("updateHeader", function(e, someInfoReceived){
// do the necessary updates here
});
答案 1 :(得分:0)
现有项目与导致问题的新添加项目之间的数据不匹配很小。
数据库中的项目具有
属性owner: {
"_id" : "213876512461"
}
而添加新项目返回的数据有
owner: "213876512461"
因此,ng-hide指令错误地隐藏了新添加的项目。
我已经标记了ruedamanuel的回答,因为我最终使用他的$ broadcast方法让主控制器更新头控制器中的$ scope.lists,否定需要使用$ rootScope或全局变量。 / p>