Angular – UI路由器 – 以编程方式添加状态

有没有办法编程添加状态到$ stateProvider模块configuration后,例如服务?

为了给这个问题增加更多的背景,我有两种方法可以解决:

  1. 尝试强制在模块configuration中定义的状态重新加载,问题是状态有reloadOnSearch设置为false ,所以当我尝试$ state.go('state.name',{新:帕拉姆},{重新加载:真正}); 没有任何反应,任何想法?

国家定义

.state('index.resource.view', { url: "/:resourceName/view?pageNumber&pageSize&orderBy&search", templateUrl: "/resourceAdministration/views/view.html", controller: "resourceViewCtrl", reloadOnSearch: false, }) 
  1. 尝试以编程方式添加我需要从服务加载状态,以便路由可以正常工作。 如果可能的话,我宁愿select第一个选项。

请参阅 – 编辑 – 获取更新的信息

通常在configuration阶段状态被添加到$stateProvider 。 如果要在运行时添加状态,则需要保留对$stateProvider的引用。

这段代码没有经过testing,但应该做你想做的。 它创build一个名为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中实现了一些称为“ 未来状态”的东西,它将照顾到一些angular落案例,比如将URL映射到尚不存在的状态。 未来的国家还展示了如何延迟加载运行时状态的源代码。 看看源代码,以了解涉及的内容。

– 编辑 – 用于UI-Router 1.0+

在UI-Router 1.0中,可以使用StateRegistry.registerStateRegistry.deregister在运行时注册和取消注册。

要获得对StateRegistry的访问权限,请将其注册为$stateRegistry ,或者注入$uiRouter并通过UIRouter.stateRegistry对其进行UIRouter.stateRegistry

UI-Router 1.0还包括处理状态定义延迟加载的未来状态,甚至可以通过URL进行同步。

克里斯T钉了它! 提供者是要走的路。 你不必把它拍到窗口对象,保护程序,更多的保护等等。

交叉引用他的答案与这篇文章真的帮助: http : //blog.xebia.com/2013/09/01/differences-between-providers-in-angularjs/#provider

该解决scheme在其configuration块中可以访问其他模块在其运行块期间的特定模块$ stateProvider。

在我的情况下,我dynamic生成仪表板的状态取决于用户的权限。

在我的configuration块,我的提供者被设置,传递模块的stateProvider(稍后访问)。

 //in dashboard.module.js var dashboardModule = angular.module('app.modules.dashboard',[ 'app.modules.dashboard.controllers', 'app.modules.dashboard.services', 'app.modules.dashboard.presentations.mileage' ]) .provider('$dashboardState', function($stateProvider){ this.$get = function(PATHS, $state){ return { /** * @function app.dashboard.dashboardStateProvider.addState * @memberof app.dashboard * @param {string} title - the title used to build state, url & find template * @param {string} controllerAs - the controller to be used, if false, we don't add a controller (ie. 'UserController as user') * @param {string} templatePrefix - either 'content', 'presentation' or null * @author Alex Boisselle * @description adds states to the dashboards state provider dynamically * @returns {object} user - token and id of user */ addState: function(title, controllerAs, templatePrefix) { $stateProvider.state('dashboard.' + title, { url: '/' + title, views: { 'dashboardModule@dashboard': { templateUrl: PATHS.DASHBOARD + (templatePrefix ? templatePrefix + '/' : '/') + title + '/' + title + '.view.html', controller: controllerAs ? controllerAs : null } } }); } } } }); 

是的,可以这样做,但是因为涉及到caching层,所以很复杂。 Alex Feinberg在他的博客上logging了一个解决scheme:

http://alexfeinberg.wordpress.com/2014/03/08/dynamically-populating-angular-ui-router-states-from-a-service/

文章的尾部包括一个使用stateProvider创build状态的例子:

 app.stateProvider.state(ent.lob.name.toLowerCase(), { url: '/' + ent.lob.name.toLowerCase(), controller: ent.lob.name.toLowerCase() + 'Controller', templateUrl: 'lobs/views/' + ent.lob.name.toLowerCase() + '.html' });