根据配置配置UI路由器状态

时间:2015-02-17 04:05:28

标签: angularjs state angular-ui-router

是否有办法根据服务器端JSON文件配置UI路由器状态。我不想避免对module.config(..)内的状态进行硬编码。

我首先想到的是拥有可用状态映射数据的控制器,它只能调用$stateProvider。但是,我相信,控制器不能将提供者注入其中。

我想到的另一个选项是将一个Javascript文件放在angular之外,它将状态配置数据放在某个全局变量中,以便从Module config函数中引用。

但是有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

我想说,通常有两种方法可以使用SERVER数据(JSON)来构建状态。

首先,我们可以使用$http加载JSON:

AngularJS - UI-router - How to configure dynamic views

这里的要点是,我们将在 .config() 状态商店引用$stateProvider并在 .run() 阶段使用它,一旦可以通过$http

加载JSON
// ref to provider, to be configured later
var $stateProviderRef;

// config phase
app.run(['$stateProvider',
  function ($stateProvider) 
  {
    $stateProviderRef = $stateProvider
  }

// run phase
app.run(['$q', '$rootScope', '$state', '$http',
  function ($q, $rootScope, $state, $http) 
  {
    $http.get("myJson.json")
    .success(function(data)
    {
      angular.forEach(data, function (value, key) 
      { 
          var state = {
            "url": value.url,
            ...
          };
          ...
          // here we still configure provider, but in RUN
          $stateProviderRef.state(value.name, state);
      });

但是有一些缺点。主要是,直接网址导航(复制 - 粘贴)无法正常工作。该网址很快就不会得到解决......

其次我的首选方式 - 在服务器上创建JSON作为变量,将其作为脚本加载。

所以服务器会以某种方式通过/ api / stateData生成响应,如:

var stateData  = [{ stateName : "State1",
  ...
}];

我们会将其作为资源注入页面

<script src="/api/stateData" ...

这可以在 .config() 阶段直接使用,并且可以解决即时配置URL的问题。