AngularUI配置状态

时间:2015-08-17 22:24:21

标签: angularjs angular-ui-router

我正在使用angularUI来配置这样的路由:

    angular.module('adminui').config(['$urlRouterProvider', '$stateProvider', '$locationProvider',
  function($urlRouterProvider, $stateProvider, $locationProvider){

    $locationProvider.html5Mode(true);

    $stateProvider
    .state('admin', {
      url: '/admin',
      templateUrl: 'vimes1984_foundation-angular-admin_client/templates/admin.ng.html',
      controller: 'adminCtrl'
    });
}]);

我想在另一个配置中配置解决方案,如下所示:

angular.module('yetibox').config(['$urlRouterProvider', '$stateProvider', '$locationProvider',
  function($urlRouterProvider, $stateProvider, $locationProvider){
    $stateProvider
    .state('admin', {
        resolve: {
              "currentUser": ["$meteor", function($meteor){
                return $meteor.requireUser();
              }]
            }
    });

}]);

但是当我收到此错误时:

Uncaught Error: [$injector:modulerr] Failed to instantiate module yetibox due to:
Error: State 'admin'' is already defined

如何在配置中配置它......

https://github.com/angular-ui/ui-router

1 个答案:

答案 0 :(得分:0)

状态需要在angualar应用程序中是唯一的,无论加载的模块如何。在您的示例中,模块adminui定义了一个名为admin的状态,模块yetibox也是如此。

因此,不可能以某种方式在另一个模块中配置状态的一部分 - 它将尝试创建一个新状态。

问题是你想要这样做的原因?根据您的问题,您希望解析当前用户,使其可用于您的admin州。这似乎是使用状态层次结构的好例子。所以类似于:

$stateProvider
    .state('root', {
        abstract: true,
        resolve: {
              "currentUser": ["$meteor", function($meteor){
                return $meteor.requireUser();
              }]
            }
    })
    .state('root.admin', {
      url: '/admin',
      templateUrl: 'vimes1984_foundation-angular-admin_client/templates/admin.ng.html',
      controller: 'adminCtrl'
    });

并非这些状态可以非常安全地加载到不同的模块中。

如果您不喜欢状态名称中的'dot'表示法来表示层次结构,则可以改为使用parent属性:

  

没有两个州可以拥有相同的名称。使用点符号时   如果没有明确提供,则推断父项,但事实并非如此   改变州名。不使用点表示法时,parent必须是   明确提供,但你仍然不能说出任何两个州的名字   相同的,例如你不能有两个不同的状态名为“编辑”   即使他们有不同的父母。

https://github.com/angular-ui/ui-router/wiki/Nested-States-and-Nested-Views