通过Angular中的服务在两个控制器之间传递var?

时间:2015-07-03 16:31:38

标签: angularjs

我有两个控制器,如下所示:

.controller('DashCtrl', function($scope, GCs, GCDetails ) {
    $scope.getData = function(id)
    {
        GCs.get(id)
        .success(function(data){
            console.log(data); // it is getting the data correctly here.

            // I want to pass the data to 'GCDetailCtrl' controller
            GCDetails = data;
        });
    };
})

.controller('GCDetailCtrl', function($scope, GCs) {
     console.log(GCDetails); // I am getting an empty object
     $scope.itemDetails = GCDetails; //nothing in it
})

我尝试了很多方法,并在stackoverflow上看到了很多线程,但我无法弄清楚问题是什么。

我的服务如下:

.service('GCDetails', function () {
    return {};
});

我觉得我的服务错了,因为我总是返回一个空对象。有什么帮助吗?感谢。

4 个答案:

答案 0 :(得分:0)

您没有在服务中分配值。您需要在服务中存储ajax响应,然后在另一个控制器中调用它。以下面的方式做到

.controller('DashCtrl', function($scope, GCs, GCDetails ) {
    $scope.getData = function(id)
    {
        GCs.get(id)
        .then(function(data){
            console.log(data); // it is getting the data correctly here.

            // I want to pass the data to 'GCDetailCtrl' controller
            GCDetails.myObject = data; // assign data in service's object
        });
    };
})

您的服务应该是

.service('GCDetails', function () {
    this.myObject = {};
    var self = this; 
    this.callAFunction = function() {
       return self.myObject ;
    };
 });

使用此服务的对象,如下所示

.controller('GCDetailCtrl', function($scope, GCs, GCDetails) {
     $scope.itemDetails = GCDetails.callAFunction();
     console.log($scope.itemDetails); //You will get the data
})

答案 1 :(得分:0)

在尝试获取更新的对象之前,您的服务必须首先设置对象。

所以看起来应该是这样的

.service('GCDetails', function(){
  var self = this;
  self.myObject = {};

  self.setObject = function (val) {
    self.myObject = val;
  };

  self.getObject = function() {
    return self.myObject;
  };
});

为什么我将这个分配给自己?为了避免碰撞,当你调用getObject或setObject时,它不知道你在调用哪个self。

答案 2 :(得分:0)

从控制器进行http调用不是一个好习惯。您可以使用http调用使服务返回一个函数。我建议的是:

app.factory('GCdetails', function($http){
    return {
        data:{},
        setData:function(data){
          this.data=data;
        },
        get : function(params){
            return $http.get(id, {
                params : params
            });
        }
    }
});

现在从控制器更新数据:

app.controller('DashCtrl',function($scope,GCdetails){
    GCdetails.get().success(function(data){
      GCdetails.setData(data);
    });
});

app.controller('GCdetailsController',function($scope,GCdetails){
    $scope.itemDetails=GCdetails.data;
});

我希望这会有所帮助。

答案 3 :(得分:0)

这应该有效,并且我总是使用服务来传递数据:

.service('GCDetails', function() {

  var myObj = {};

  this.setObject = function (val) {
    myObj = val;
  };

  this.getObject = function() {
    return myObj;
  };
});

同样在您的控制器中,请确保从控制器中拨打GCDetails.setObject(yourvalue),以便在拨打GCDetails.getObject()时实际上有值。