【问题标题】:Angular2 router canActivate no provider for falseAngular2 路由器 canActivate no provider for false
【发布时间】:2016-11-30 09:02:11
【问题描述】:

所以我的代码如下所示:

export const routes: RouterConfig = [
  { 'path': '', redirectTo: '/jobs', terminal: true, canActivate: [tokenNotExpired()]  },
  { path: 'account', component: AccountComponent, canActivate: [!tokenNotExpired()] },
  { path: 'login', component: LoginComponent },
  ...WihRoutes
];

每当我尝试导航到“帐户”时,路由都会失败,但由于某种原因,它也会出现以下控制台错误:

browser_adapter.ts:82 例外:错误:未捕获(承诺):否 错误的提供者!BrowserDomAdapter.logError @ browser_adapter.ts:82BrowserDomAdapter.logGroup @ browser_adapter.ts:93ExceptionHandler.call @ exception_handler.ts:58(匿名函数)@ application_ref.ts:374schedulerFn @ async.ts:148SafeSubscriber.__tryOrUnsub @ Subscriber.ts:240SafeSubscriber.next @ Subscriber.ts:192Subscriber._next @ Subscriber.ts:133Subscriber.next @ 订阅者.ts:93Subject._finalNext @ Subject.ts:154Subject._next @ Subject.ts:144Subject.next @ Subject.ts:90EventEmitter.emit @ async.ts:133onError @ ng_zone.ts:142onHandleError @ ng_zone_impl.ts:95ZoneDelegate.handleError @ zone.js:327Zone.runGuarded @ zone.js:233_loop_1 @ zone.js:487drainMicroTaskQueue@zone.js:494ZoneTask.invoke@ zone.js:426 browser_adapter.ts:82 STACKTRACE:BrowserDomAdapter.logError @ browser_adapter.ts:82ExceptionHandler.call @ exception_handler.ts:61(匿名函数)@ application_ref.ts:374schedulerFn @ async.ts:148SafeSubscriber.__tryOrUnsub @ Subscriber.ts:240SafeSubscriber.next @ Subscriber.ts:192Subscriber._next @ Subscriber.ts:133Subscriber.next @ 订阅者.ts:93Subject._finalNext @ Subject.ts:154Subject._next @ Subject.ts:144Subject.next @ Subject.ts:90EventEmitter.emit @ async.ts:133onError @ ng_zone.ts:142onHandleError @ ng_zone_impl.ts:95ZoneDelegate.handleError @ zone.js:327Zone.runGuarded @ zone.js:233_loop_1 @ zone.js:487drainMicroTaskQueue@zone.js:494ZoneTask.invoke@ zone.js:426 browser_adapter.ts:82 错误:未捕获(承诺):否 提供者为假! 在 resolvePromise (zone.js:538) 在 zone.js:515 在 ZoneDelegate.invoke (zone.js:323) 在 Object.onInvoke (ng_zone_impl.ts:72) 在 ZoneDelegate.invoke (zone.js:322) 在 Zone.run (zone.js:216) 在 zone.js:571 在 ZoneDelegate.invokeTask (zone.js:356) 在 Object.onInvokeTask (ng_zone_impl.ts:61) 在 ZoneDelegate.invokeTask (zone.js:355)

还有错误图片,因为格式很糟糕。

我不知道为什么会发生这种情况 - 还有其他人吗?

【问题讨论】:

  • tokenNotExpired() 长什么样子?
  • 返回真/假,仅此而已。如果我写 canActivate: false 也会发生同样的事情

标签: angular angular2-routing


【解决方案1】:

传递给canActivate: [!tokenNotExpired()] 的值需要是提供者。 !tokenNotExpired() 不是有效的提供者。

canActivate: ['tokenExpired']
canActivate: ['!tokenExpired']

并在引导程序或APP_ROUTER_PROVIDERS中提供

bootstrap(AppComponent, [
  {provide: 'tokenExpired', useValue: (a: any, b: any) => tokenExpired()}
  {provide: '!tokenExpired', useValue: (a: any, b: any) => !tokenExpired()}
]);

【讨论】:

  • 据我所知,将纯 false 传递给 canActivate 不需要提供程序吗?如果是的话,我会喜欢一些说明类似内容的文档。
  • angular.io/docs/ts/latest/guide/… 展示了如何提供保护。 github.com/angular/angular/blob/… 显示如何始终提供 false。我宁愿看到解释您在问题中显示的内容应该有效的文档。
  • 我只是想离开这个:守卫的返回值控制路由器的行为:如果它返回true,则导航过程继续,如果它返回false,导航过程停止并且用户留在原地跨度>
  • 但是你在路由中添加到canActivate: [...] 的只是一个守卫的提供者,而不是守卫。您可以使用useValue: false,但canActivate: [false'] 不起作用。
  • Fab,谢谢。阅读 angular2-jwt 的源代码,它似乎返回 true/undefined,并且由于某种原因而不是 false。现在明白了,干杯!
猜你喜欢
  • 2017-10-05
  • 2023-03-26
  • 2022-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2018-05-31
  • 1970-01-01
相关资源
最近更新 更多