Я использую angular 2 ленивую маршрутизацию. Клиент поставляется с webpack2 с использованием AOT и angular -router-loader для пользователей с ленивой загрузкой. Все работает так, как ожидается, когда браузер подключен, то есть я могу успешно перемещаться по маршрутизатору к ленивому загруженному модулю, кусок загружен успешно, и я могу просмотреть компонент и т.д.
Однако, если я эмулирую отсоединение (например, используя опцию "Негативные инструменты разработчика Chrome" ), маршрутизация прерывается, как и ожидалось, потому что не может загрузить соответствующий фрагмент. Ошибка: "Ошибка загрузки блока [номер канала]"
После этого команда маршрутизации не работает, она похожа на маршрутизатор.
Я попытался обработать ошибку, используя глобальный ErrorHandler. Идея заключалась в том, что, возможно, я мог поймать ошибку, прежде чем она сломает маршрутизатор, но похоже, что к тому времени уже слишком поздно. В то время, когда я поймаю ошибку, маршрутизатор не работает.
import { Injectable, ErrorHandler, Injector } from '@angular/core';
import { Router } from '@angular/router';
@Injectable()
export class CustomErrorHandler extends ErrorHandler {
constructor(private injector: Injector) {
super(false);
}
private get router(): Router {
return this.injector.get(Router, null);
}
public handleError(error: Error) {
if (/Loading chunk [\d]+ failed/.test(error.message)) {
console.info('Offline mode');
let router = this.router;
if (router) {
router.navigateByUrl('/offline').then(t => console.debug(t+'')).catch(t=> console.debug(t));
} else {
window.location.href = '/';
}
}
}
}
Пользовательский обработчик ошибок работает, потому что печатается сообщение "Offline mode". Инъекция также работает, маршрутизатор не является нулевым, однако навигация маршрутизатора не работает, обещание маршрутизатора не разрешено и не отклонено.
То, что я пытаюсь выполнить, - это обработать ошибку (например, показать информационное сообщение пользователю) и в то же время иметь маршрутизатор в рабочем состоянии, чтобы пользователь мог перемещаться позже (при подключении к Интернету восстанавливается) без перезагрузки всей страницы.
Обновление 1: попытка воспроизведения без использования aot и webpack
Чтобы узнать, является ли это проблемой маршрутизатора angular, я попытался понять, что происходит при попытке работать в автономном режиме с компиляцией jit. Я использовал: angular rounk plunker, перешел на вкладку входа в систему, переключился в автономный режим и нажал логин. При загрузке модуля администрирования был зарегистрирован ряд ошибок "Ошибка: XHR error load". В конечном итоге навигация не удалась, однако после этого маршрутизация не нарушилась. Я смог перейти на другие вкладки, и после переключения обратно я даже смог перейти к администратору. Возможно, проблема заключается в том, как angular -router-loader плагин webpack пытается загрузить модуль.
Обновление 2: Кажется, это известная проблема
Функция: более надежный загрузчик модулей для маршрутизатора