UI的路由器.从对象/函数获取状态名称

Eug*_*kov 5 angularjs angular-ui-router

我想知道,有没有办法用对象或函数来引用状态?

只是为了从状态定义中分离视图.例如,如果我更改州名,我不必在我的视图中随处更改它.

Rad*_*ler 9

下面描述的一种解决方案可以在这里找到,作为工作的插件

在这个例子中,我们将为某个实体(例如员工)定义状态,如:

  1. 列表视图和
  2. 细节视图.

让我们使用一些变量entityName来扮演解耦命名的角色:

var entityName = "employee";

$stateProvider
    .state(entityName, {
        url: '/' + entityName,
        views: {
          ...
      }})

    .state(entityName + '.detail', {
        url: '/{{Id}}',
        views: {
          ...
      }});
Run Code Online (Sandbox Code Playgroud)

从列表导航到详细视图(我们可以看到,没有使用明确的"员工"名称):

<a ui-sref="{{detailLink(item)}}" >{{item.Name}}</a>
Run Code Online (Sandbox Code Playgroud)

接下来我们要定义detailLink(item).我们将直接在controller这里进行,但它可能是一些ListModel实例,包含更多操作(分页,排序),包括detailLink.

controller:['$scope','$state',
  function ( $scope , $state){ 

      $scope.detailLink = function (item){

          // here we get the employee in run-time
          var currentState = $state.current.name; 
          var sref = currentState + '.detail({Id:' + item.Id + '})';
          return sref;
      };
}],
Run Code Online (Sandbox Code Playgroud)

就是这样.它可能更复杂...... 可以在这里找到并运行完整的示例代码(在下面作为状态定义)

.config(['$stateProvider',
function( $stateProvider) {

    var entityName = "employee";

    $stateProvider
      .state(entityName, {
        url: '/' + entityName,
        views: {
          body: {
          template: '<div>' +
                    '  <h2>List View</h2> ' +
                    '  <ul ng-repeat="item in items"> ' +
                    '   <li><a ui-sref="{{detailLink(item)}}" >{{item.Name}}</a>' +
                    '  </li></ul>' +
                    '  <h2>Detail View</h2> ' +
                    '  <div ui-view="detail"></div>' +
                    '</div>',
          controller:['$scope','$state',
            function ( $scope , $state){ 

              $scope.items = [{Name : "Abc", Id : 0}, {Name : "Def", Id : 1}];

              $scope.detailLink = function (item){

                 var currentState = $state.current.name;
                 return currentState + '.detail({Id:' + item.Id + '})';
              };
          }],
        }
      }})
      .state(entityName + '.detail', {
        url: '/{{Id}}',
        views: {
          detail: {
          template: '<div>' +
                    '  <label>{{item.Name}} ' +
                    '  <input ng-model="item.Name"}}" type="text" />' +
                    '  <div>current state name: <i>{{state.name}}<i></div> ' +
                    '</div>',
          controller:['$scope','$stateParams','$state',
            function ( $scope , $stateParams , $state){ 
              $scope.state = $state.current
              $scope.item = $scope.items[$stateParams.Id];
          }],
        }
      }});

}])
Run Code Online (Sandbox Code Playgroud)