[英]Object not being updated correctly inside Angular Service
我相信这与JS Closures的工作方式有关,但我不确定。 我正在使用AngularJS服务来管理在我的应用程序中使用的模型的生命周期。 该服务结合使用fetch()
和save()
来运行GET和POST请求,以从API获取和更新模型。 在fetch()
对象之后,我尝试将结果放入位于服务中的对象中,以便以后可以获取它。 我的问题是,成功执行save()
,我将结果放入相同的对象中,以使用服务器上的正确对象实质上“更新”客户端上的对象(因此,结果如果一切成功,则POST只是负载的回显)。
问题是我的对象没有持久化,并且随后对save()
所有调用都包含一个未完全更新的“陈旧”对象。
这是我的服务:
app.factory('MailboxSubscription', function (API, $q, $stateParams, $rootScope) {
var Subscription = null; //THIS IS MODEL THAT I TRY TO UPDATE CONSTANTLY
var isBusy = false;
var service = {};
var deferred;
var defaultFailure = function(res){
}
service.fetch = function (success, force, failure) {
if(!failure){ failure = defaultFailure;}
if(isBusy){
deferred.promise.then(success, failure);
return deferred.promise;
}else{
deferred = $q.defer();
}
if(Subscription && !force){ // ONCE THE MODEL HAS BEEN FETCHED ONCE, IT STAYS IN MEMORY AND ALL SUBSEQUENT CALLS WILL SKIP THE API CALL AND JUST RETURN THIS OBJECT
deferred.resolve(Subscription);
}else{
//Make the API call to get the data
//Make the API call to get the data
if(typeof(success) === 'function'){
var ServiceId = $stateParams.serviceId;
}else{
var ServiceId = success;
}
isBusy = true;
API.Backups.O365.Exchange.get({id : ServiceId || $stateParams.serviceId}, function(res){
isBusy = false;
if(res.success){
Subscription = res.result; // ON A FIRST-TIME FETCH, THIS API CALL IS USED TO GET THE MODEL
deferred.resolve(Subscription);
}else{
deferred.reject(res);
}
}, function(res){
isBusy = false;
deferred.reject(res);
});
}
deferred.promise.then(success, failure);
return deferred.promise;
}
service.save = function(success, failure){
if(!failure){ failure = function(){};}
if(!success){ success = function(){};}
var deferred = $q.defer();
API.Backups.O365.Exchange.update({id :$rootScope.ServiceId || $stateParams.serviceId}, Subscription, function(res){
if(res.success){
Subscription = res.result; // AFTER AN UPDATE IS MADE AND THE OBJECT IS SAVED, I TRY TO SET THE RESULT TO Subscription.
deferred.resolve(res);
}else{
deferred.reject(res);
}
}, function(res){
deferred.reject(res);
});
deferred.promise.then(success, failure);
return deferred.promise;
}
service.get = function(){
return Subscription;
}
return service;
});
因此,问题似乎源于试图将Subscription
用作存储模型的集中资源,但是模型没有正确更新。
如果您希望整个服务中都更新该订阅模型,那么当您在控制器中调用MailboxSubscription.fetch()
和MailboxSubscription.save()
时,建议您在中使用MailboxSubscription.get()
。 then(
)方法。
// get initial value of Subscription model
$scope.Subscription = MailboxSubscription.get();
// let's fetch
MailboxSubscription.fetch().then(
// callback
function() {
// let's get the updated model
$scope.Subscription = MailboxSubscription.get();
},
// errback
function() {
// handle error
}
);
// let's save
MailboxSubscription.save().then(
// callback
function() {
// let's get the updated model
$scope.Subscription = MailboxSubscription.get();
},
// errback
function() {
// handle error
}
);
另外,我创建了一个可工作的jsfiddle来简化您的用例。 工作正常。 也许有些东西可以闪闪发光(我正在使用$ timeout欺骗您的API调用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.