繁体   English   中英

在Angular Service中无法正确更新对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM