针对Angularv12,为什么路由守卫没有按预期工作?和angular路由守卫异步这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展angular2+路由守卫、Angular2验证器未按预期
针对Angular v12,为什么路由守卫没有按预期工作?和angular路由守卫异步这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展angular 2+ 路由守卫、Angular 2验证器未按预期工作、Angular 5%管道digitInfo无法按预期工作、angular – http提供程序Observable.toPromise()在promise链中没有按预期工作等相关知识,希望可以帮助到你。
本文目录一览:- Angular v12,为什么路由守卫没有按预期工作?(angular路由守卫异步)
- angular 2+ 路由守卫
- Angular 2验证器未按预期工作
- Angular 5%管道digitInfo无法按预期工作
- angular – http提供程序Observable.toPromise()在promise链中没有按预期工作
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+ 路由守卫
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验证器未按预期工作
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>
问题是,即使密码匹配,它仍然显示错误.我看了很多不同的类似问题,但大多数人都有点混乱和过时,所以我想写一个更清洁的解决方案.
我猜测只需要一个小调整,但我似乎无法弄明白.
解决方法
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无法按预期工作
{{0.7 | percent:'1.2-5'}}
我按预期得到了这个:70.00%
但是,当我这样做时:
{{0.07 | percent:'1.2-5'}}
我得到7.00000%而不是预期的7.00%
我只是做错了什么或者这是Angular中的一个错误?
解决方法
{{0.7 | percent:'1.2'}} --> 70.00% {{0.07 | percent:'1.2'}} --> 7.00%
angular – http提供程序Observable.toPromise()在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链中没有按预期工作的相关信息,请在本站查询。
本文标签: