导航不更新$ scope更改

时间:2014-03-26 22:13:13

标签: angularjs angularjs-scope

我的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中。有什么想法吗?

2 个答案:

答案 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>