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

时间:2014-05-11 09:05:48

标签: angularjs angular-ui-router

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

只是将视图与州定义分离。例如。如果我改变州名,我不必在我的观点中随处更改。

1 个答案:

答案 0 :(得分:9)

下面介绍的一种解决方案可以在这里找到,作为工作plunker

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

  1. 列表视图和
  2. 详细信息视图。
  3. 让我们使用一些变量entityName来扮演解耦命名的角色:

    var entityName = "employee";
    
    $stateProvider
        .state(entityName, {
            url: '/' + entityName,
            views: {
              ...
          }})
    
        .state(entityName + '.detail', {
            url: '/{{Id}}',
            views: {
              ...
          }});
    

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

    <a ui-sref="{{detailLink(item)}}" >{{item.Name}}</a>
    

    接下来,我们必须定义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;
          };
    }],
    

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

    .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];
              }],
            }
          }});
    
    }])