同步服务缓存的Angular 1.3的最佳做法是什么?

问题描述 投票:0回答:1

我正在使用angular 1.3进行一个遗留项目,并被困在一个决定上,即在更新后或接收数据所需的时间比摘要周期长的时候,使服务变量和$ scope保持同步的最佳方法是什么。

我正在服务中实现变量缓存,该服务将为变量返回getter,如下所示:

return function () {
            if(!this.games)
            {
                this.games= [];
                if(!!this.gameTypeId)
                    this.getAll(this.gameTypeId);
                else
                    this.getAll();
            };
            return this.games;
        }

如果getAll函数花费的时间超过摘要周期,则视图不会更新。 因此,一种解决方法是使用$ apply,但感觉我正在以错误的方式进行处理。 因为承诺看起来像这样:

return Resource.query({id: gameTypeId, resourceName: "Games/ByGameType"})
                    .$promise.then(function(response){
                        if(!$rootScope.$$phase) {
                            $rootScope.$apply(function () {
                                angular.extend(this.games, response);
                            });
                        }
                        else
                            angular.extend(this.games, response);
                    });

并且您必须检查$ digest循环是否真的结束(如果promise更快地返回值,则视图会自动更新)。

另一种方法是在控制器周围撒满承诺回报并在那里更新$ scope.games,在这一方面,控制器变得更加拥挤。 与其返回getter中的函数,还不如返回一种将$ scope.games重新绑定到service-> this.games值的方法。 第一种方法现在已经实现并且可以使用,但是不确定这是否是最佳方法。

javascript angularjs service
1个回答
0
投票

这个

                    if(!$rootScope.$$phase) {
                        $rootScope.$apply(function () {
                            angular.extend(this.games, response);
                        });
                    }

是不必要的安全设备。 角$q承诺始终在摘要循环上执行。

angular.extend将通过合并旧元素和新元素来angular.extend数组。 除非有此要求,否则应为

angular.copy(this.games, response);
© www.soinside.com 2019 - 2024. All rights reserved.