有没有一种方法可以在模块配置之后以编程方式将状态添加到$ stateProvider中,例如在service中?
为了给这个问题增加更多的背景,我有两种方法可以使用:
国家定义
.state('index.resource.view', { url: "/:resourceName/view?pageNumber&pageSize&orderBy&search", templateUrl: "/resourceAdministration/views/view.html", controller: "resourceViewCtrl", reloadOnSearch: false, })
通常,状态会$stateProvider在配置阶段添加到中。如果要在运行时添加状态,则需要保留对$stateProvider周围的引用。
$stateProvider
该代码未经测试,但是应该做您想要的。它创建一个名为的服务runtimeStates。您可以将其注入运行时代码,然后添加状态。
runtimeStates
// config-time dependencies can be injected here at .provider() declaration myapp.provider('runtimeStates', function runtimeStates($stateProvider) { // runtime dependencies for the service can be injected here, at the provider.$get() function. this.$get = function($q, $timeout, $state) { // for example return { addState: function(name, state) { $stateProvider.state(name, state); } } } });
我已经在UI-Router Extras中实现了一些称为FutureStates的东西,这些东西为您处理了一些特殊情况,例如将url映射到尚不存在的状态。FutureStates还显示了如何延迟加载运行时状态的源代码。看一下源代码,以了解其中涉及的内容。
-edit-适用于UI-Router 1.0+
在UI-Router 1.0中,可以使用StateRegistry.register和在运行时注册和注销状态StateRegistry.deregister。
StateRegistry.register
StateRegistry.deregister
要访问StateRegistry,请将其作为$stateRegistry注入,或$uiRouter通过注入和访问UIRouter.stateRegistry。
$stateRegistry
$uiRouter
UIRouter.stateRegistry
UI-Router 1.0还提供了开箱即用的Future States,可以处理状态定义的延迟加载,甚至可以通过URL进行同步。