在Angular 2中从解析器取消路线导航

Pra*_*ddy 5 redirect typescript angular2-routing

我需要取消拒绝承诺的路由,并停留在当前页面上而不重定向到默认/错误页面,我尝试了不同的拒绝承诺的方法,但最终解决了该路由或重定向到了默认路由。

@Injectable()
export class ModelResolver implements Resolve<MyModel> {
    constructor(private router: Router) {
    }

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<any> {
        let params: any = route.params;

        let model: MyModel= new MyModel();


        return model.init().then((obj: MyModel) => {
                    return obj;
                }).catch((err: any) => {
                    Promise.reject({message: err , ngNavigationCancelingError: true});
            });
    }

}
Run Code Online (Sandbox Code Playgroud)

reject({message: err , ngNavigationCancelingError: true}); //重定向到我的默认路由

return Observable.throw({message: err , ngNavigationCancelingError: true}); //重定向到当前路由而不取消

resolve(null); or return Observable.empty() //重定向到当前路由而不取消

m e*_*m e 5

为了取消解析器的路由,可以使用observable代替promise并调用:observer.complete(),而无需调用:observer.next()

例如:

 resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){

   return new Observable((observer) => {
     let somePromiseOrObservableToGetDate=?????;

     somePromiseOrObservableToGetDate.then(data => {
       if (data) {
         observer.next(1);
       }
       observer.complete();
     })
       .catch((err: any) => {
         observer.complete();
       });
   });

 } 
Run Code Online (Sandbox Code Playgroud)

在您的示例中:

let model: MyModel = new MyModel();

return new Observable((observer) => {
  model.init().then((obj: any) => {
    observer.next(obj);
    observer.complete();
  })
    .catch((err: any) => {
      observer.complete();
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 在Angular 6中这种行为可能会改变吗?使用此代码,导航仍然对我而言发生。 (2认同)