我目前正在查询服务器以检查是否有新数据,然后相应地更新AngularJS应用程序中的模型。以下大致是我的操作:
setInterval(function () {
$http.get('data.json').then(function (result) {
if (result.data.length > 0) {
// if data, update model here
} else {
// nothing has changed, but AngularJS will still start the digest cycle
}
});
}, 5000);
这个方法可以正常运行,但大部分请求并没有返回任何新数据或数据更改,但是$http服务并不知道/关心此事,仍然会触发digest循环。我认为这是不必要的(因为digest循环是应用程序中最重的操作之一)。 有没有办法仍然使用$http但如果没有任何更改就跳过digest循环?
一个解决方案是不使用$http而是使用jQuery,然后调用$apply使Angular知道模型已经改变:
setInterval(function () {
$.get('data.json', function (dataList) {
if (dataList.length > 0) {
// if data, update model
$scope.value = dataList[0].value + ' ' + new Date();
// notify angular manually that the model has changed.
$rootScope.$apply();
}
});
}, 5000);
虽然这个方法似乎可行,但我不确定它是否是一个好主意。如果可能的话,我仍然想使用纯Angular。
有人对上述方法有改进建议或更高效的解决方案吗?
附言:我之所以使用setInterval而不是$timeout是因为$timeout也会触发$digest循环,在这种情况下是不必要的,并且只会加剧“问题”。
$http
会触发$apply
,从而引发一个 digest 循环。 - asgoth$timeout
有一个可选参数叫做“invokeApply”,如果设置为false,将跳过digest循环。如果$http
也提供相同的选项,那么这是有意义的。 - Strille