首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现CanDeactivate保护时出错

实现CanDeactivate保护时出错
EN

Stack Overflow用户
提问于 2019-06-15 12:07:16
回答 2查看 969关注 0票数 0

我目前正在尝试为我的CanDeactivate应用程序实现一个HTTP,该应用程序已经有了HTTP来解析身份验证。但是添加CanDeactivate保护是抛出错误,如下所述。

我已经在CanDeactivate的提供者数组中注册了实现AppModule接口的类。我已经在路由的CanDeactivate属性中注册了实现canDeactivate接口的类。

类实现CanDeactivate接口:

代码语言:javascript
复制
export interface CanComponentDeactivate {
  canComponentDeactivate(): boolean;
}

@Injectable({providedIn: 'root'})
export class AppRegisterDeactivateGuard implements CanDeactivate<AppRegisterComponent> {
  canDeactivate(
    component: AppRegisterComponent,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot
  ): Observable<boolean>|Promise<boolean>|boolean {
    return component.isDeactivated;
  }
}

应用停用保护的组件:

代码语言:javascript
复制
@Component({
  selector: 'app-app-register',
  templateUrl: './app-register.component.html',
  styleUrls: ['./app-register.component.css']
})
export class AppRegisterComponent implements OnInit, CanComponentDeactivate {
  isDeactivated = false;
  @ViewChild('registrationForm') registForm: NgForm;
.
.
canComponentDeactivate() {
    if (this.registForm.dirty) {
      this.isDeactivated = confirm('You have modified changes in the form. \nDo you still want to navigate away ? ');
    }
    return this.isDeactivated;
  }
}

该端点的路由定义:

代码语言:javascript
复制
...
{ path: 'register', component: AppRegisterComponent, canDeactivate: ['AppRegisterDeactivateGuard'] },

模块中的提供者数组:

代码语言:javascript
复制
 providers: [{
    provide: HTTP_INTERCEPTORS,
    useClass: AppAuthInterceptService,
    multi: true
  }, AppRegisterDeactivateGuard],
  bootstrap: [AppComponent]

错误

代码语言:javascript
复制
  StaticInjectorError(Platform: core)[AppRegisterDeactivateGuard]: 
    NullInjectorError: No provider for AppRegisterDeactivateGuard!
Error: StaticInjectorError(AppModule)[AppRegisterDeactivateGuard]: 
  StaticInjectorError(Platform: core)[AppRegisterDeactivateGuard]: 
    NullInjectorError: No provider for AppRegisterDeactivateGuard!
    at NullInjector.push../node_modules/@angular/core/fesm5/core.js.NullInjector.get (core.js:8896)
    at resolveToken (core.js:9141)
    at tryResolveToken (core.js:9085)
    at StaticInjector.push../node_modules/@angular/core/fesm5/core.js.StaticInjector.get (core.js:8982)
    at resolveToken (core.js:9141)
    at tryResolveToken (core.js:9085)
    at StaticInjector.push../node_modules/@angular/core/fesm5/core.js.StaticInjector.get (core.js:8982)
    at resolveNgModuleDep (core.js:21218)
    at NgModuleRef_.push../node_modules/@angular/core/fesm5/core.js.NgModuleRef_.get (core.js:21907)
    at getToken (router.js:2865)
    at resolvePromise (zone.js:831)
    at resolvePromise (zone.js:788)
    at zone.js:892
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Object.onInvokeTask (core.js:17290)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
    at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
    at drainMicroTaskQueue (zone.js:601)
    at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:502)
    at invokeTask (zone.js:1744)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-15 12:50:14

改变您的路线:

代码语言:javascript
复制
{ path: 'register', component: AppRegisterComponent, canDeactivate: [AppRegisterDeactivateGuard] }

将提供程序更改为:

代码语言:javascript
复制
[{
    provide: HTTP_INTERCEPTORS,
    useClass: AppAuthInterceptService,
    multi: true
  }]

较长的答覆:

AppRegisterDeactivateGuard既拥有{providedIn: 'root'}又将其声明为模块中的提供程序是不必要的。请参阅角提供程序文档

这里的问题是与路由和提供者的结合。

现在,您的路由正在通过字符串名称查找令牌,但是它可以通过类名获得。

使用@Injectable({providedIn: 'root'}) --如何使用它--它使用类名作为令牌,并且它可以作为AppRegisterDeactivateGuard使用。

在您的提供者中使用AppRegisterDeactivateGuard (如何使用它)也将使它可以作为AppRegisterDeactivateGuard使用。

我不建议这样做,但如果您希望或需要通过字符串名称引用它,您可以将其放在提供程序中,如下所示:

代码语言:javascript
复制
{ provide: 'AppRegisterDeactivateGuard', useClass: AppRegisterDeactivateGuard }
票数 1
EN

Stack Overflow用户

发布于 2019-06-15 12:20:56

您需要在泛型中传递接口:

代码语言:javascript
复制
export class AppRegisterDeactivateGuard implements CanDeactivate<CanComponentDeactivate > {

然后实现canDeactivate方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56610239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档