GVKun编程网logo

Angular v12,为什么路由守卫没有按预期工作?(angular路由守卫异步)

12

针对Angularv12,为什么路由守卫没有按预期工作?和angular路由守卫异步这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展angular2+路由守卫、Angular2验证器未按预期

针对Angular v12,为什么路由守卫没有按预期工作?angular路由守卫异步这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展angular 2+ 路由守卫、Angular 2验证器未按预期工作、Angular 5%管道digitInfo无法按预期工作、angular – http提供程序Observable.toPromise()在promise链中没有按预期工作等相关知识,希望可以帮助到你。

本文目录一览:

Angular v12,为什么路由守卫没有按预期工作?(angular路由守卫异步)

Angular v12,为什么路由守卫没有按预期工作?(angular路由守卫异步)

如何解决Angular v12,为什么路由守卫没有按预期工作??


auth.service.ts
  get(): Observable<HttpResponse<any>> {
    return this.http.get<any>(urls.angular.signin_guard,authOptions);
  }


auth.guard.ts
  checkAuth(): true | UrlTree {
    this.auth.get().subscribe(
      () => {
        return true;
      }
    );
    return this.router.parseUrl(''/account/signin'');
  }

  canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): true | UrlTree {
    return this.checkAuth();
  }


router.ts
  {
    path: ''account'',canActivateChild: [AuthGuard],children: [
      {path: ''me'',component: MeComponent}
    ]
  },

auth.service.ts => 检查用户是否登录

auth.guard.ts => 如果用户已经登录,返回true,其他人会跳转到登录页面

解决方法

你应该返回一个 observable。类似:

  checkAuth(): Observable<boolean| UrlTree> {
    return this.auth.get().pipe(
      mapTo(true),catchError((e) => of(this.router.parseUrl(''/account/signin'')))
    )
  }

angular 2+ 路由守卫

angular 2+ 路由守卫

1. 定义接口名称 /domain/login-guard.ts

export interface LoginGuard {
  data: any;
  msg: string;
  status: boolean;
}

2. 定义 actions  /ngrx/actions/login-guard.action.ts

import { Action } from ''@ngrx/store'';
import {LoginGuard} from ''../../domain/login-guard'';


/**
 * For each action type in an action group, make a simple
 * enum object for all of this group''s action types.
 */
export enum ActionTypes {
  GUARD = ''[GUARD]''
};

/**
 * Every action is comprised of at least a type and an optional
 * payload. Expressing actions as classes enables powerful
 * type checking in reducer functions.
 */
export class GuardSuccess implements Action {
  readonly type = ActionTypes.GUARD;

  constructor(public payload: LoginGuard) { }
}


/**
 * Export a type alias of all actions in this action group
 * so that reducers can easily compose action types
 */
export type Actions
  = GuardSuccess;

3. 定义 reducers  /ngrx/actions/login-guard.reducer.ts

import * as fromLogin from ''../actions/login-guard.action'';
import {LoginGuard} from ''../../domain/login-guard'';

export interface State {
  guard: LoginGuard;
}

export const initialState: State = {
  guard: {
    data: '''',
    msg: '''',
    status: true
  }
};

export function reducer(state = initialState, action: fromLogin.Actions): State {
  switch (action.type) {
    case fromLogin.ActionTypes.GUARD: {
      return {...state, guard: action.payload};
    }
    default: {
      return state;
    }
  }
}

4. login.service.ts

import {Injectable} from ''@angular/core'';
import {ActivatedRouteSnapshot, NavigationEnd, Router, RouterStateSnapshot} from ''@angular/router'';
import {Observable} from ''rxjs/Observable'';
import ''rxjs'';
import {HttpClient} from ''@angular/common/http'';
import * as fromReducer from ''../ngrx/reducers/index'';
import {Store} from "@ngrx/store";
import {GuardSuccess} from ''../ngrx/actions/login-guard.action'';

export class LoginService {

  constructor(private router: Router, private http: HttpClient, private store$: Store<fromReducer.State>) {
  }

// canActivate: 控制是否允许进入路由。
  canActivate(route: ActivatedRouteSnapshot,
              state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.activate();
  }

// 在登陆的时候会把登陆信息存到浏览器localStorage,退出登陆时remove掉,如果是直接打开地址而没有登陆的话,会跳到登陆界面,judgeuser是请求用户信息接口,setUserInfo()把请求到的信息存到浏览器
  activate(): Observable<boolean> {
    const url = `${environment.path}/judgeUser`;
    const params = JSON.parse(localStorage.getItem(''LOGININFO''));
    const param = {
      emNumber:params.emNumber,
      emPhone:params.emPhone
    }
    return this.http.post(url, param).map((guard: LoginGuard) => {
      const guard$ = guard;
      if (!guard$.status) {
        this.router.navigate([''/'']);
      }
      setUserInfo(guard$);
      this.store$.dispatch(new GuardSuccess(guard$));
      return guard$.status;
    });
  }

}

5. service 注入

import {LoginService} from ''./service/login.service'';
@NgModule({
  declarations: [
    AppComponent,
    DemoComponent,
    // HtmlPipe
  ],
  imports: [
    BrowserAnimationsModule,
    AppRoutingModule,
    ViewModule,
    ShareModule,
    AppStoreModule,
    HttpClientModule,
    DirectivesModule,
  ],
  providers: [LayerService, InterfaceService, LoginService, {
    provide: LocationStrategy,
    useClass: HashLocationStrategy
  }],
  bootstrap: [AppComponent]
})
export class AppModule { }

 

Angular 2验证器未按预期工作

Angular 2验证器未按预期工作

我有这个验证器:

export const PasswordsEqualValidator = (): ValidatorFn => {

  return (group: FormGroup): Observable<{[key: string]: boolean}> => {

    const passwordCtrl: FormControl = <FormControl>group.controls.password;
    const passwordAgainCtrl: FormControl = <FormControl>group.controls.passwordAgain;

    const valid = passwordCtrl.value.password === passwordAgainCtrl.value.passwordAgain;

    return Observable.of(valid ? null : {
      passwordsEqual: true
    });
  };
};

以这种形式使用:

public signupForm: FormGroup = this.fb.group({
    email: ['',Validators.required],passwords: this.fb.group({
      password: ['',passwordAgain: ['',Validators.required]
    },{validator: CustomValidators.passwordsEqual()})
  });

使用它的模板的一部分:

<div formGroupName="passwords">
  <div[ngClass]="{error: !signupForm.get('passwords').valid}">
    <labelfor="password">Password</label>
    <inputid="password" formControlName="password" type="password">
  </div>
  <div[ngClass]="{error: !signupForm.get('passwords').valid}">
    <labelfor="password-again">Password again</label>
    <inputid="password-again" formControlName="passwordAgain" type="password">
  </div>
</div>

问题是,即使密码匹配,它仍然显示错误.我看了很多不同的类似问题,但大多数人都有点混乱和过时,所以我想写一个更清洁的解决方案.

我猜测只需要一个小调整,但我似乎无法弄明白.

解决方法

试试这个,因为你需要比较2值并且验证器不是异步验证器,你只能返回boolean而不是Observable

export const PasswordsEqualValidator = (): ValidatorFn => {

  return (group: FormGroup): boolean => {

    const passwordCtrl: FormControl = <FormControl>group.controls.password;
    const passwordAgainCtrl: FormControl = <FormControl>group.controls.passwordAgain;

    const valid = passwordCtrl.value === passwordAgainCtrl.value;

    return valid ? null : {
      passwordsEqual: true
    };
  };
};

顺便说一下,使用这种方法进行最佳实践:

export const PasswordsEqualValidator = (): ValidatorFn => {

  return (group: FormGroup): boolean => {

    const passwordCtrl: FormControl = group.get('password');
    const passwordAgainCtrl: FormControl = group.get('passwordAgain');

    const valid = passwordCtrl.value === passwordAgainCtrl.value;

    return valid ? null : {
      passwordsEqual: true
    };
  };
};

这里演示:http://plnkr.co/edit/9PzGSIuBhvNz0fpJxTlS?p=preview

Angular 5%管道digitInfo无法按预期工作

Angular 5%管道digitInfo无法按预期工作

如果我在Angular 5模板中执行此操作:

{{0.7 | percent:'1.2-5'}}

我按预期得到了这个:70.00%

但是,当我这样做时:

{{0.07 | percent:'1.2-5'}}

我得到7.00000%而不是预期的7.00%

我只是做错了什么或者这是Angular中的一个错误?

解决方法

看起来像 DecimalPipe的错误,因为 PercentPipe使用它进行格式化.简单删除maxFractionDigits,它是分数后的最大位数(默认为3),可以获得所需的结果:

{{0.7 | percent:'1.2'}} --> 70.00%
{{0.07 | percent:'1.2'}} --> 7.00%

angular – http提供程序Observable.toPromise()在promise链中没有按预期工作

angular – http提供程序Observable.toPromise()在promise链中没有按预期工作

如果我使用ng2 http提供程序Observable.toPromise()支持调用promise启用方法,它按预期工作,但当我将它作为promise链的一部分使用时,它会在then处理程序处理完并返回结果之前解析返回的promise.

使Observable.toPromise()在promise链中工作的任何已知问题或我可能测试的替代方法使其成为与promise链兼容的结果?在http请求,promise链中的最后一项,已完成其异步请求并返回结果之前,我被此解析承诺阻止.

例如

this.myService.getSomethingInvolvingingMultiplePromiseCalls().then(result => {
    let valueFromSomethingInvolvingMultiplePromiseCalls = result;
},err => { 
    console.error('landed in app.component outer promise rejected handler,see output window for details')
})

public getSomethingInvolvingingMultiplePromiseCalls(): Promise<string> {
    return this.getSomethingInvolvingPromiseCall().then(resultPromise1 => {
        let resultPromise1propertyFoo = resultPromise1.propertyFoo;
            return this.getSomethingInvolvingNg2HttpProviderToPromiseCall(resultPromise1propertyFoo);
        }
        .then(resultPromise2 => {
            let resultPromise2propertyBar = resultPromise2.propertyBar;
            return resultPromise2propertyBar;
        }   
    }

getSomethingInvolvingNg2HttpProviderToPromiseCall(arg1: string): Promise<string> {
   let body = 'some body content Leveraging arg1';
   let headers = new Headers({ 'Authorization': 'Bearer ' + accesstoken,'Content-Type': 'application/x-www-form-urlencoded' });
   let options = new RequestOptions({ headers: headers });

   return this.http.post(resourceBaseAddress + '/someRestApi',body,options).toPromise().then(response => {
        let responseJson = response.json();
        return responseJson['someJsonProperty'];
      });
    }
}

提前感谢任何见解或建议.

解决方法

我找到了解决方法.

它涉及创建和返回一个typescript延迟的promise,我控制解析只有在我使用angular2 http provider toPromise()调用then方法调用方法时才解析.

我没有与其他承诺链接方案有什么关系,但无论出于何种原因,在这种情况下允许停放方法调用方,直到完成链中的http提供者toPromise()调用.

public getSomethingInvolvingingMultiplePromiseCalls(): Promise<string> {
    let resolveFn,rejectFn;
    let promise = new Promise((resolve,reject) => { resolveFn = resolve; rejectFn = reject; });

    this.getSomethingInvolvingPromiseCall().then(resultPromise1 => {
        this.getSomethingInvolvingNg2HttpProviderToPromiseCall(resultPromise1).then(resultPromise2 => resolveFn(resultPromise2));
    }

    return promise;  // return the promise for outside callers to wait on
}

我们今天的关于Angular v12,为什么路由守卫没有按预期工作?angular路由守卫异步的分享已经告一段落,感谢您的关注,如果您想了解更多关于angular 2+ 路由守卫、Angular 2验证器未按预期工作、Angular 5%管道digitInfo无法按预期工作、angular – http提供程序Observable.toPromise()在promise链中没有按预期工作的相关信息,请在本站查询。

本文标签: