一尘不染

AngularJS-UI路由器-以编程方式添加状态

angularjs

在模块配置之后,例如在service中,有没有办法以编程方式将状态添加到$ stateProvider?

为了给这个问题增加更多的上下文,我有两种情况可以使用:

  1. 尝试强制在模块配置中定义的状态上重新加载,问题是状态将 reloadOnSearch 设置为 false ,所以当我尝试 $ state.go(’state.name’,{new:param},{reload:真正}); 什么都没发生,有什么想法吗?

国家定义

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

阅读 242

收藏
2020-07-04

共1个答案

一尘不染

请参阅-edit-以获取最新信息。

通常,状态会$stateProvider在配置阶段添加到中。如果要在运行时添加状态,则需要保留对$stateProvider周围的引用。

此代码未经测试,但应执行您想要的操作。它创建一个名为的服务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中实现了一些称为 Future States的 东西,这些东西为您处理了一些特殊情况,例如将url映射到尚不存在的状态。Future
States还显示了如何延迟加载运行时状态的源代码。看一下源代码,以了解其中涉及的内容。

-edit-适用于UI-Router 1.0+

在UI-Router 1.0中,可以使用StateRegistry.register和在运行时注册和注销状态StateRegistry.deregister

要访问StateRegistry,请将其作为$stateRegistry注入,或$uiRouter通过注入和访问UIRouter.stateRegistry

UI-Router 1.0还提供了开箱即用的Future States,可以处理状态定义的延迟加载,甚至可以通过URL进行同步。

2020-07-04