1

嗯,我需要在不同的角度控制器或任何函数中使用一个变量,但是在这种特殊情况下,我从服务或函数中获取其中一个变量的值,您希望如何调用它,这是代码如何在javascript/angular中的函数内设置一个全局变量的值?

//global variable userdata 
userdata = {}; 

ng.tcts.service('$user', function($http, $q, $window, $boots){ 
return{ 

    login: function(data){ 
     var deferred = $q.defer(); 

     $http({ 
      method:'POST', 
      url:ng.api+'/log/in', 
      data:{ 
        data:data 
       }, 
      headers:{'Content-type':'application/x-www-form-urlencoded'}   
     }).success(function(response, status, headers, config){ 
      if(response.success){ 
       console.log(response); 
       //userdata assignation 
       userdata = response.data; 
       deferred.resolve([response.respnum, response.success, response.report, response.data]); 
      } 
      else{ 
       deferred.resolve([response.respnum, response.success, response.report, response.data]); 
      } 
     }).error(function(response, status, headers, config){ 
      deferred.reject([response.respnum, response.success, response.report]); 
     }); 
     return deferred.promise;   
    } 

); 

正如你可以看到我asigining用户数据的成功函数内部response.data的价值,当我在功能环境它的工作原理使用它,在分配工作正常,但是当我尝试在它外面使用它时,对象是空的,我希望你能帮助我,thx

+0

你打电话给外面? – jayaguilar

+0

你是什么意思,变量或服务?就像thisdata =服务{ \t \t用户名:$ scope.username, \t \t密码:$ scope.password \t \t}; \t \t var promise = $ user.login(data); – user3384672

回答

5

所有你需要做的是使该获取并设置用户数据,并保持在服务中的服务。然后,您创建一个返回该数据的方法,您可以将其注入到应用程序的任何控制器中。

app.service('userData',function(){ 
var data; 

this.get = function() { 
    // do your ajax call to get your user data and in the response data = response; 
} 

this.data = function() { 
    return data; 
} 
}); 

然后在任何控制器:

function myCtrl($scope,userData) { 
    // you can access it with this userData.data(); 

    // or set it to a $scope var 

    $scope.userData = userData.data(); 
} 

制作一个全局变量,也不是那么多地方可以如何使用角度,你可以创建一个服务,你再注入到你的控制器交谈数据或者您可以将其设置为$ rootScope var,然后在任何控制器中引用它。永远不要创建一个全局变量并在你的控制器中引用它。这就是你最终在Angular中发生内存泄漏的原因。

+1

但在此c我每次需要拨打一个电话给用户的数据,这就是我想要避免的情况 – user3384672

+0

不,你不会得到数据,只要将它分配给服务中的数据变量,然后你就可以使用userData.data()指向它。相信我,我在我的应用程序中这样做。 – btm1

+0

所以你说这会削减奶酪,还是我做错了? http://plnkr.co/edit/FoKeHFu0y2QCOIk0jzKy?p=catalogue – user3384672

1

不是100%清楚你的问题是什么。如果您只是希望从任何控制器拨打此服务并获得价值userdata,那么只需通过response.data解决您的承诺。

因此,在您的服务:

deferred.resolve(response.data); 

*或者你需要

任何其他响应项目,并在控制器:

$user.login(payload).then(function(userData){ 
    console.log(userData); 
}); 

如果你想保持后你这个数据已经向服务器提出请求,你也可以设置某个地方在变量(as @ btm1建议)的服务,如下例所示。

Example

+0

我需要的是将response.data值分配给用户数据对象 – user3384672

+0

,但我只调用它一次,这就是全局变量的原因,只是简单介绍一次,并在整个会话中使用它,而不会每次发出数据请求是使用 – user3384672

+0

是的,那么第二部分(见粗体)将是要走的路 –

相关问题