[英]Angular ui-router: load values for data and params from service
我想加载data
和params
每个状态时,一次从我的服务的应用程序加载settings
(此服务的回报也promise
,因为数据的异步加载)。
像这样的东西:
.state('tutorials', {
url: '/tutorials',
templateUrl: 'partials/tutorials.html',
controller: 'TutorialsCtrl',
data: {details: false}, // instead of false I want: settings.get('tutorials_data_details')
params: {popular: '512'} // instead of '512' I want: settings.get('tutorials_params_popular')
})
在进入任何状态之前,必须为所有状态加载这些params
因为它们用于构建与ui-sref
指令的链接,该指令可以放置在指向任何状态的任何html
(并且将使用这些默认params
)。
问题是我无法将service
注入config
功能。 并且使用resolve
不会立即处理所有状态。
我认为$stateProvider.decorator
可以使用,但我不知道如何。
我会评论,但没有足够的声誉。
如果可能,一个选项是创建一个父抽象状态,如app
,所以你的状态树将成为app.tutorials
然后你可以在app
状态上使用resolve
,允许所有子状态使用data / params。
这样的事情:
.state('app', {
url: '',
abstract: true,
templateUrl: 'partials/tutorials.html',
controller: 'AppCtrl',
resolve: { <resolve your dependencies here> }
})
.state('app.tutorials', {
url: '/tutorials',
templateUrl: 'partials/tutorials.html',
controller: 'TutorialsCtrl'
})
请注意,在完成解析之前,Tutorials状态将不会加载。
经过一些研究和思考,我想出了这三种可能的解决方案:
1)通过使用decorator
我们使所有状态解析settings
服务。
.decorator('data', function(state, parent) {
state.resolve.SettingsLoaded = ['settings', function(settings) { return settings.$promise; }];
return parent(state);
})
然后在settings
服务中使用加载成功回调来设置状态。 您可以使用$state.get()
来获取所有状态(或使用string
参数按名称获取特定状态)并修改params
对象。
请注意 ,您不能使用像state.params.popular = '512'
这样的短版本,而是使用完整版本: state.params.popular.value = '512'
。
2)这些params
实际上可以是注入和调用的函数,并且将使用结果值。 所以该state
的新params
定义将是:
params: {popular: ['settings', function(settings) { return settings.get('tutorials_params_popular') || '512'; }]}
此外,我再次使用相同的decorator
,以确保在加载任何状态之前解析settings
。
我最喜欢这种方法,因为所有参数值都保留在settings
服务中,并且动态反映了变化。
3)由于我使用的是RequireJS
,我可以使用它加载设置,然后将其注入路由器文件。 但是,这需要对我的settings
服务中的现有代码进行更多更改...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.