如何使用ui-router在各州之间共享范围值

时间:2017-02-17 07:40:22

标签: angularjs angular-ui-router

我在ng-init中调用一个函数并将值存储在数组中以便在ng-repeat中使用。如何在同一控制器和不同控制器中的某些状态下使用该数组。

我找到了

 app.run(['$rootScope', '$state', '$stateParams', function ($rootScope, $state, $stateParams)
      {
          $rootScope.$state = $state;    
          $rootScope.$stateParams = $stateParams;    
      }
]);

但它不起作用

如果我使用$ rootScope.arr = [];比各州都有,但没有美元范围。

2 个答案:

答案 0 :(得分:0)

您应该在路由器中使用params。这允许您在两个(或更多)状态之间传递信息。例如,假设使用UI-Router,您可以设置这样的状态来传递url字符串中的参数:

state('state-one', {
  url: '/new?itemId',
  templateUrl: 'index-one.html'
})

您可以通过将此变量添加到状态(或者具有完全独立的控制器文件)来访问控制器中的变量:

controller: function($scope, $stateParams) {
  $scope.itemId = $stateParams.itemId;
}

在两个状态之间导航并在模板中传递该信息:

<a ui-sref="state-one({ itemId: 1 })">State One</a>

同样,您也可以设置状态以使参数可用,并传递信息:

state('state-two', {
  url: '/two',
  templateUrl: 'index-two.html',
  params: {
    itemId: null,
    itemObject: null
  }
})

在不使用模板链接的情况下在状态之间移动:

$state.go('state-two', { itemId: vm.someId, itemObject: { some: object } });

在你的情况下,这将有效:

state('state-three', {
  url: '/three',
  templateUrl: 'index-three.html',
  params: {
    array: null
  },
  controllerAs: 'vm'
})

在状态二的控制器(例如)中移动到状态-3并保留数组以供状态三使用:

$state.go('state-three', { array: $scope.myArray })

这假设$ scope.myArray已分配给状态二控制器中的数组。你使用'array'作为参数中的值,所以当你在状态三的控制器中再次访问它时,你将在$ stateParams.array上做你的逻辑 - 将它分配给那个控制器(状态 - 三个人可以使用,如:

$scope.myArray = $stateParams.array;

如果你在ng-repeat中使用它('vm'是控制器的$ scope):

<div ng-repeat="item in vm.myArray">

答案 1 :(得分:0)

在app.js中定义你的html模板状态,如下所示:

  .state('booklist',{
            url:'/booklist/:array',        //eg- I am passing id and title
            views:{
            'menuContent':{
             templateUrl:'templates/booklist.html',
             controller:'BooklistCtrl'                 
             }
             }
             })

在你的html模板中

<div class="list" ng-repeat="item in array">
  <p>{{item.title}}</p>
  <p>{{item.id}}</p>
  <button ng-click = pass(array)>Click Me</button>
</div> 

在你的控制器中,

    $scope.pass = function(data){
          $state.go('booklist',{array:name});
    }  

在你的控制器中,两个,

    $scope.arr = $stateParams.array;

更新

编写一个函数来存储数组中的值

//example
controller('ExampleCtrl',function($scope){

function loadData(){
  //you get your data here..after this
  $scope.data = [];
  for(var i =0 ; i<5; i++){
      $scope.data.push({});  //data stored in your array
  }
};

loadData();   //call the above function, no need to use ng-init 

//pass $scope.data array in to another controller

 })