Сейчас я просматриваю сервер для проверки новых данных, а затем обновляю модель в приложении 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 действительно не знает/не заботится и все равно вызовет цикл дайджеста. Я считаю, что это не нужно (поскольку цикл дайджеста является одной из самых тяжелых операций в приложении). Есть ли способ по-прежнему использовать $http, но каким-то образом пропускать дайджест, если ничего не изменилось?
Одним из решений было бы не использовать $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, если это возможно.
У кого-нибудь есть предложения по улучшению вышеприведенного подхода или более элегантного решения?
P.S. Причина, по которой я использую setInterval вместо $timeout, состоит в том, что $timeout также запускает цикл дайджеста, который в этом случае был бы лишним и только добавлял бы к "проблеме".