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

是的,那麼第二部分(見粗體)將是要走的路 –

相關問題