我正在使用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值的方法。 第一种方法现在已经实现并且可以使用,但是不确定这是否是最佳方法。
这个
if(!$rootScope.$$phase) {
$rootScope.$apply(function () {
angular.extend(this.games, response);
});
}
是不必要的安全设备。 角$q
承诺始终在摘要循环上执行。
angular.extend
将通过合并旧元素和新元素来angular.extend
数组。 除非有此要求,否则应为
angular.copy(this.games, response);