在控制器之间传递变量的最佳方法

时间:2016-05-06 14:36:39

标签: javascript angularjs

我使用的是三个Angular控制器:

**Controller1**

var fetchStudentDetails = function(){
    var sDetails = myService.getList(//url-1 here);
    sDetails.then(function (data) {
            $scope.studentData = data.list;
            var studentId = $scope.studentData[0].id;
    });
}
fetchStudentDetails();
$scope.loadSecondLevel = function(){
                $state.go('secondLevel');               
              }


**Controller2**

    var fetchClassDetails = function(){
    var sDetails = myService.getList(//url-2 here);
    sDetails.then(function (data) {
            $scope.classData = data.list;
            var className = $scope.classData[0].name;
    });
    }
    fetchClassDetails();
    $scope.loadThirdLevel = function(){
        $state.go('thirdLevel');                
    }

**Controller3**

   $scope.putStudentDetails = function(){
   // Here I need studentId,className for updateResource
        var sDetails = myService.updateResource(//url-3 here);
        sDetails.then(function (data) {

        });     
    }

我必须将studentId(在Controller1中),className(在Controller2中)传递给Controller3中的函数。我尝试使用$ rootScope,它正在工作,但刷新页面时$ rootScope值变为空。有谁知道怎么做?

3 个答案:

答案 0 :(得分:1)

您的问题可以分为两个方面:

<强> 1。如何在控制器之间共享数据
在Angular 1.x中共享数据的最佳实践是使用factory,将共享数据存储在工厂服务中,并向控制器公开访问方法:

factory('DetailData', function(myService, $q){

     var _details;

     function __getDetailData(){
           return details
     }

     function __setDetailData(){
          return myService.getList().then(function(data){
              _details = data;
          })
     }

     return {
         getDetailData: __getDetailData,
         setDetailData: __setDetailData
     }

})


controller('myContrller', function(DetailData, $scope){
    $scope.data = DetailData.getDetailData();
})

<强> 2。如何在页面刷新时保留数据
您可以使用localStorage在页面重新加载期间保持数据持久性,许多工具和库可以实现这一点,例如ngStorage,或者每次角度应用程序启动时都可以从服务器重置数据:

//this would register work which would be performed 
//when app finish loading and ready to start. 
angular.module('app').run(function(DetailData){

    DetailData.setDetailData();

})

答案 1 :(得分:0)

取决于您正在解决的问题。 有三种选择:

  1. 是将数据保存到$rootScope
  2. 使用$scope.$emit&amp; $scope.$on功能。
  3. 使用自定义服务存储数据
  4. 如果您需要保存数据,那么在完整页面重新加载后可以使用它 - localStorage

答案 2 :(得分:0)

嘿,这个问题在Passing data between controllers in Angular JS?

中得到回应

但简单的回应是在服务中。