当状态发生变化时,如何使角度ui-router父状态始终执行控制器代码?

时间:2014-01-29 06:45:58

标签: javascript angularjs state angular-ui angular-ui-router

假设我们在$ stateProvider中定义了父子关系,如下所示:

    .state('myProfile', {
        url: "/my/profile",
        templateUrl: 'my/profile.html',
        controller: 'MyProfileController'
    }).state('myProfile.edit', {
        url: "/edit",
        templateUrl: 'my/profile.edit.html',
        controller: 'EditMyProfileController'
    });

这里的想法是父myProfile状态是不可编辑的,但子myProfile.edit状态是编辑配置文件的实际形式。让我们忽略,如果这是个人资料页面的工作方式 - 我只是在玩弄东西和学习。

当用户提交表单时,我使用$ state对象返回父页面:

$scope.save = function() {
    userResource.update($scope.user, function() {
        SessionService.refresh();

        $state.go('myProfile'); // also tried with reload: true as well
    });
}

用户保存配置文件数据后 - 正确保存 - 除非我按F5并刷新浏览器,否则父视图不会更新。

我注意到的一件事是,如果我将孩子myProfile.edit状态变成父本身而不是myProfile状态的孩子,这个问题实际上会消失,事情就像预期的那样(尽管如此) ,布局看起来很糟糕。)

似乎UI路由器可能正在缓存父级的结果,不知道模型中的内容已发生变化,是否需要重新运行控制器?

如果仍然让父myProfile页面始终执行其控制器以重新加载其数据,我如何保持我的父子关系?基本上,我希望每当使用$state或点击指向myProfile的链接时都会发生这种情况。我怎么能这样做?

如果我不能按照我要求做的话,那么我知道我可以设置一堆子状态并使它们按预期工作...但是,如何为父设置默认子状态?例如,假设我希望myProfile.edit成为myProfile的默认子状态 - 我该怎么做?

谢谢!

3 个答案:

答案 0 :(得分:35)

要在从子状态导航到他时强制父状态重新加载,您可以使用以下两种方式。纯粹的js或指令属性。

<a ui-sref="myProfile" ui-sref-opts="{ reload: true }">Back to My Profile</a>

$state.go('myProfile', null, { reload: true });

答案 1 :(得分:3)

您是否尝试过收听&#34; $ stateChangeStart&#34;事件和/或使用$ state.reload()?

答案 2 :(得分:2)

好像$ state.go上有一个错误,它会遗漏重新加载选项。 $ state.transition然而对我有用。

$state.transitionTo('state',null,{reload: true});