$ rootScope属性未更新angularjs中的路由更改

时间:2015-03-15 02:22:08

标签: angularjs angularjs-scope

在我的index.html <head>中,我有以下元素:

<link
    rel="alternate"
    type="application/rss+xml"
    title="{{feedJobsTagName}} jobs feed"
    href="{{feedJobTagsUrl}}"
    ng-if="feedJobTagsUrl">

当我将路由更改为新标记时,我有一个解析器来获取标记并更新根范围(TagShowCtrl)上的两个属性:

$rootScope.feedJobTagsUrl = '/feeds/jobs/'+tag.type+'s/'+tag.nameLower;
$rootScope.feedJobsTagName = tag.name;

如果我刷新页面,我会得到正确的标签名称,但是如果我只是通过链接到新标签名称来更改路线,它似乎会缓存第一个名称而不是用新名称更新它:

.when('/tags/:slug/:id', {
    templateUrl: 'partials/tags/show',
    controller: 'TagShowCtrl',
    resolve: {
        tag: ['$route', 'Tag', function($route, Tag){
            return Tag.get({ id: $route.current.params.id}).$promise;
        }]
    }
})

1 个答案:

答案 0 :(得分:0)

要将更改应用于视图,您必须在控制器的$scope上绑定 $ routeChangeSuccess
事件。

$scope.$on('$routeChangeSuccess', function(next, current) {
    $rootScope.feedJobTagName = "new value";
});
  

请注意,它无法在您的控制器内$rootScope上正常工作。

虽然您的控制器范围已更新,但更改不会应用于视图,因为路线的解析对象会返回承诺。 (看看究竟发生了什么here

对于所有异步任务,您需要$apply对摘要循环进行更改或使用events provided by Angular - 您的情况$routeChangeSuccess

请注意,在异步get承诺完成后,控制器实例化。