【问题标题】:How to set a value to a global variable inside a function in javascript/angular? [duplicate]如何在javascript / angular中的函数内为全局变量设置值? [复制]
【发布时间】:2014-06-18 03:01:33
【问题描述】:

嗯,我需要在不同的角度控制器或任何函数中使用一个变量,我可以这样做,但在这种特殊情况下,我从服务或函数中获取其中一个变量的值,你想要什么调用它,这是代码

//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;        
    }

);

如您所见,我在成功函数中为 userdata 分配 response.data 的值,当我在函数环境中使用它时,分配工作正常,但是当我尝试在它之外使用它时,对象是空的,希望你能帮我解决这个问题,谢谢

【问题讨论】:

  • 你在外面怎么称呼它?
  • 你是什么意思,变量还是服务?服务之类的data = { username: $scope.username, password: $scope.password }; var promise = $user.login(data);

标签: javascript angularjs variables functional-programming global-variables


【解决方案1】:

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

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();
}

创建一个全局变量并不是你使用 Angular 的方式,你可以创建一个服务,然后将其注入到你的控制器中,这样多个地方就可以访问该数据,或者你可以将它设置为 $rootScope 变量,然后在任何地方引用它控制器。永远不要创建一个全局变量并在你的控制器中引用它。这就是在 Angular 中最终导致内存泄漏的原因。

【讨论】:

  • 但在这种情况下,每次我需要将用户数据发送到服务器时,我都必须拨打电话,而这正是我想要避免的
  • 不,一旦将数据分配给服务中的数据变量,您就不会获得数据,然后您只需使用 userData.data() 指向它。相信我,我在我的应用程序中执行此操作。
  • 所以你是说这会切奶酪,还是我做错了? plnkr.co/edit/FoKeHFu0y2QCOIk0jzKy?p=catalogue
  • @btm1 你在哪里调用 getdata()?我必须在每个控制器中都这样做......否则 data() 是未定义的......我也不能像这样分配“$scope.userData = userData.data()”,因为在分配时 data() 不是尚未从服务器返回...
【解决方案2】:

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

所以为您服务:

deferred.resolve(response.data);

*或您需要的任何其他响应项目

在控制器中:

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

如果您想在已经向服务器发出请求后维护这些数据,您也可以在变量中设置某个位置 (如@btm1 建议的那样)服务,如下例所示。

Example

【讨论】:

  • 我需要将 response.data 值赋给 userdata 对象
  • 但是我只调用了一次,这就是全局变量的原因,只需调用一次并在整个会话中使用它,而不是每次使用数据时都发出请求
  • 是的,那么第二部分(见粗体)将是要走的路
  • 我不明白你能不能用一个例子来解释我,我做了这个plunker你能告诉我你是不是这个意思plnkr.co/edit/eEa9Vef2UhR1WGgUV5ZN?p=info
  • 这里是一个使用来自网络服务的电影信息的示例:plnkr.co/edit/3xML1Z4Uuxxp0yinRTPW?p=preview
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2020-10-28
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多