我正在观看@john_lindquist 的关于 RxJS 的蛋头教程,他强调了不包括业务逻辑而不是.subscribe()
方法的观点。
因此,我正在创建一个 canActivate 防护来防止用户进入无效路由,并且我不禁将逻辑构建到 subscribe 方法中。有一个更好的方法吗?
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, Router } from '@angular/router';
import { Subscription } from 'rxjs/Subscription';
import { Subject } from 'rxjs/Subject';
import { Apollo, ApolloQueryObservable } from 'apollo-angular';
import { GQTicketId } from './ticket.model';
@Injectable()
export class TicketRouteActivatorService implements CanActivate {
public ticket;
private returnTrue: Subject<Boolean> = new Subject<Boolean>();
private ticketSubscription: Subscription;
constructor(private apollo: Apollo,
private router: Router) { }
canActivate(route: ActivatedRouteSnapshot ) {
this.ticketSubscription = this.apollo.watchQuery({
query: GQTicketId,
variables: {
_id: +route.params['id']
}
}).subscribe(({data})=>{
this.ticket = data['ticket'];
// this doesn't seem right, atleast based on the guidance from John Linquidst. Should this logic be "Rx'd" some how?
if(!this.ticket) {
this.router.navigate(['provision/requests/error/404']);
} else {
this.returnTrue.next(true);
}
}
);
if (this.returnTrue) return true;
}
// do we need to unsubscribe?
ngOnDestroy():void {
this.ticketSubscription.unsubscribe();
}
}