Угловой резольвер 5/6 и наблюдаемый - PullRequest
0 голосов
/ 10 мая 2018

Я буквально схожу с ума, пытаясь использовать Resolver в Angular 6.

My Resolver, рабочая версия:

    @Injectable()
export class MyResolver implements Resolve<boolean> {
    constructor() {
    }

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
        return true;
    }

Я ввожу это так в моей маршрутизации:

path: "secure",
    component: SecureComponent,
    canActivate: [AuthGuard],
    canActivateChild: [AuthGuard],
    resolve: {
        myValue: MyResolver
    }

Это работает правильно, конструктор компонента запущен, и я могу получить myValue из маршрута.

Но как только я изменю свой резольвер на:

return Observable.create(true);

Или любой код, который возвращает Observable вместо простого значения, конструктор компонента больше не запускается, и я получаю пустую страницу на своем маршруте. Код распознавателя по-прежнему выполняется полностью.

Я убедился, что конструктор не запущен, поместив console.log ("foo") в самую первую строку конструктора, и он не вызывается.

Так что я не могу понять, почему я не могу вывести наблюдаемое из моего преобразователя. Весь смысл решателей состоит в том, чтобы разрешать отложенные значения (таким образом возвращая наблюдаемые значения).

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Observable.create принимает функцию в качестве аргумента.

Observable.create(true) приведет к ошибке при подписке.Компонент не был создан, поскольку существует ошибка навигации, которая не была обнаружена.

Если распознаватель должен вернуть существующее значение, это следует сделать так, как показывает исходный код:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    return true;
}
0 голосов
/ 10 мая 2018

Я думаю, что проблема в том, что Observable.create не завершает наблюдаемый поток.Таким образом, подписка на вашем маршруте ничего не излучает.Вы должны попробовать что-то вроде этого:

import { of } from 'rxjs/observable/of';

return of(true);

Это вернет полное наблюдаемое.Или вы также можете сделать:

return Observable.create((observer) => {
  observer.next(true);
  observer.complete();
    });

Дайте мне знать ..

...