我打算使用ui-routers解析功能向我的控制器注入一些读取的解决方案。
我使用示例plnkr作一个例子。
请考虑以下嵌套状态:route1
和route1.list
。
我在abc
上定义了一个名为route1
的解析函数。现在,当我第一次导航到route1
时,abc
被调用并将被解决。现在,当我导航到route1.list
并返回route1
时,abc
不再被调用。
http://plnkr.co/edit/mi5H5HKVAO3J6PCfKSW3?p=preview
我想这是故意的,但考虑一下这个用例: resolve函数通过http检索一些数据,并且应该在某些时候刷新/无效,可能在每次状态更改时刷新/无效。有没有办法在使用嵌套状态时执行此操作? 如果在每次注入时都调用了resolve函数,我可以按照我想要的方式实现它:返回旧的,已解决的promise或创建一个新的。
我只是简单地对此进行了测试,但是如果状态不是嵌套的,那么事情就会像我预期的那样工作。放弃嵌套状态因为这很臭。并且在嵌套状态中具有可用的解析依赖性实际上很不错。
答案 0 :(得分:30)
将选项reload:true
提供给go()
/ transtionTo()
/ ui-sref
可以解决问题:-)
感谢Designing the Code
指点我这个方向。解决方案虽然有点不同,所以我写下了这个答案。
reload(v0.2.5) - {boolean = false},如果为true,则强制转换,即使状态或参数没有改变,也就是重新加载相同的状态。它与reloadOnSearch不同,因为当你想在一切都相同时强制重新加载时你会使用它,包括搜索参数。
直接的方法是将每个ui-sref
链接更改为以下内容:<a ui-sref="route1" ui-sref-opts="{reload: true}">
。
为了避免在每个链接上提供选项,我在$state
周围写了一个装饰器(另请参阅http://plnkr.co/edit/mi5H5HKVAO3J6PCfKSW3?p=preview):
myapp.config(function($provide) {
$provide.decorator('$state', function($delegate) {
var originalTransitionTo = $delegate.transitionTo;
$delegate.transitionTo = function(to, toParams, options) {
return originalTransitionTo(to, toParams, angular.extend({
reload: true
}, options));
};
return $delegate;
});
});
答案 1 :(得分:11)
尝试$state.reload();
它会强制再次解决。虽然认为存在一些与此相关的问题,即控制器未重新加载。 (ui.router n00b也在这里)