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

时间:2016-07-15 16:38:56

标签: javascript angularjs service

我正在开发一个带有角度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值。第一种方法现在已经实施并且有效,但不确定它是否是最佳方式。

1 个答案:

答案 0 :(得分:0)

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

是不必要的安全设备。角度$q承诺总是在摘要周期上执行。

angular.extend将通过组合旧元素和新元素来破坏数组。除非这是要求,否则它应该是

angular.copy(this.games, response);