Я заменил $http
на Fetch API, а $q
заменил на Promise API. Из-за этого Angular больше не запускал циклы дайджеста, поэтому пользовательский интерфейс не отображался. Чтобы решить эту проблему, я попробовал Zone.js, и это частично решило наши проблемы. К сожалению, его API полностью изменился в версии 0.6, поэтому мы используем устаревшую версию 0.5.15. а>.
Теперь к самой проблеме.
При обновлении страницы Angular конфигурирует и загружает приложение, как и ожидалось. На этом этапе я инициализирую Зону и украшаю $rootScope.apply
Зоной и $rootScope.$digest()
. Теперь, когда я переключаюсь между состояниями/маршрутами (с помощью ui-router), все работает, как и ожидалось, но при полном обновлении возникает состояние гонки, и зона/дайджест работает неправильно. Я не знаю, как это исправить.
У меня есть следующий код в блоке angular.run()
:
console.log('Zone setup begin');
const scopePrototype = $rootScope.constructor.prototype;
const originalApply = scopePrototype.$apply;
const zoneOptions = {
afterTask: function afterTask() {
try {
$rootScope.$digest();
} catch (e) {
$exceptionHandler(e);
throw e;
}
}
};
scopePrototype.$apply = function $applyFn() : void {
const scope = this;
const applyArgs = arguments;
window.zone.fork(zoneOptions).run(() => {
originalApply.apply(scope, applyArgs);
console.log('Zone + $digest run!');
});
};
console.log('Zone setup end');
Выше вы можете видеть, что я захожу в консоль, когда начинается инициализация Zone, когда она заканчивается и когда она запускается (+ цикл дайджеста Angular). В моем контроллере, где я извлекаю данные через Fetch API, я добавил console.log('Data fetched!');
, чтобы знать, когда данные были извлечены.
Теперь вывод в консоли:
Переход состояния с помощью ui-router (отлично работает)
Обратите внимание, что дайджест запускается в конце.
Zone setup begin
Zone setup end
Zone + $digest run!
Zone + $digest run!
Zone + $digest run!
Zone + $digest run!
Data fetched!
Zone + $digest run!
Полное обновление состояния/маршрута (не запускается в конце)
Zone setup begin
Zone setup end
Zone + $digest run!
Zone + $digest run!
Zone + $digest run!
Zone + $digest run!
Data fetched!
Как видите, зона/дайджест не запускается после получения данных, поэтому данные и пользовательский интерфейс не отображаются на странице.
fetch
обещанием $q (тоже подходит для тестирования). Вы также можете проверить другой подход, который вообще касается нативных промисов в A1, stackoverflow.com/questions/39943937/ - person Estus Flask   schedule 23.08.2017$q.when
(патч здесь), и он по-прежнему не запускает последний дайджест. Думаю, проблема в другом. Это объясняет, почему это работало на главной странице с некоторыми запросами API. - person Gaui   schedule 23.08.2017instanceof Promise
. Это не означает, что это проблема, с которой вы столкнулись, но это определенно проблема. Кстати, вы никогда не должны полагаться на более старую Zone, весь смысл Zone в том, что она постоянно исправлена, потому что это один огромный взлом. - person Estus Flask   schedule 23.08.2017async
. - person Estus Flask   schedule 23.08.2017