我有以下角度服务
//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;
});
});
答案 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);
});
}
});