0

试图在 Angular 6 中使用解析器,我真的快疯了。

我的解析器,工作版本:

    @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") 来验证构造函数没有被触发,并且它没有被调用。

所以我不明白为什么我不能从我的解析器输出一个可观察的。解析器的全部意义在于解析延迟值(从而返回可观察对象)。

我究竟做错了什么?

4

2 回答 2

3

我认为问题在于 Observable.create 没有完成可观察流。因此,订阅您的路线不会发出任何内容。你应该尝试这样的事情:

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

return of(true);

这将返回一个完整的 observable。或者你也可以这样做:

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

让我知道..

于 2018-05-10T13:46:29.980 回答
1

Observable.create 接受一个函数作为参数。

Observable.create(true)将导致订阅错误。该组件未实例化,因为存在未捕获的导航错误。

如果解析器应该返回现有值,则应按照原始代码所示完成:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    return true;
}
于 2018-05-10T13:51:28.727 回答