在Angular

时间:2017-01-27 15:48:08

标签: angularjs service ng-controller

我有以下角度服务

//SERVICES
app.service('userInfo', function($http){
    this.getInfo = function() {

        var BASE_URL = "";
        var requestUrl = BASE_URL + "/getmyproperties";
        return $http({ 
                    'method': 'GET',
                    'url': requestUrl,
                    'headers': { "Accept": "application/json; odata=verbose"}
                }).then(function(response){
                    console.log(response.data.d);
                    var userName = response.data.d.DisplayName.split(',');

                    var data = {
                        firstName: userName[1],
                        userImage: response.data.d.PictureUrl,
                        lanID: response.data.d.AccountName
                    };

                    return data;

                }).catch(function(e){
                    console.log("Error: ", e);
                }); 
    }
});

也许我误解了服务,因为我只是在学习Angular,但我希望现在能够在应用程序的多个位置使用data.UserName,所以我想我可以使用服务,但服务功能执行两次 - 我不想要,我怎样才能获取价值然后到处使用它?我应该使用嵌套控制器吗?

//NAV CONTROLLER
app.controller('navBarController', function($scope, userInfo) {
    userInfo.getInfo().then(function(data) {
        $scope.user = data;
    });
});
//END NAV CONTROLLER

//TASK CONTROLLER
app.controller('taskController', function($scope, userInfo) {
    userInfo.getInfo().then(function(data) {
        $scope.test = data;
    });
});

1 个答案:

答案 0 :(得分:2)

getInfo方法正在调用Web服务。因此,每次调用该方法时,都会调用Web服务。解决方案是将信息存储在userInfo服务中的变量中,一旦从Web服务获取该信息。然后在getInfo中首先检查信息是否已全部加载。如果是,请将其退回。如果不是,请调用Web服务。这是一个很简单的例子:

app.service('userInfo', function($http){
    var userInfo = undefined;
    this.getInfo = function() {
        var BASE_URL = "";
        var requestUrl = BASE_URL + "/getmyproperties";
        if(userInfo) {
            var deferred = $q.defer();
            deferred.resolve(userinfo); 
            return deferred.promise;
        }
        return $http({ 
                'method': 'GET',
                'url': requestUrl,
                'headers': { "Accept": "application/json; odata=verbose"}
            }).then(function(response){
                console.log(response.data.d);
                var userName = response.data.d.DisplayName.split(',');

                userInfo = {
                    firstName: userName[1],
                    userImage: response.data.d.PictureUrl,
                    lanID: response.data.d.AccountName
                };

                return userInfo;

            }).catch(function(e){
                console.log("Error: ", e);
            }); 
    }
});