2017-11-15 6 views
0

나는이 주제와 관련된 게시물을 읽었지만 아직 해결 방법을 찾지 못했습니다.약속 완료 될 때까지 기다림

이 내 시나리오 : PermissionService, 보이는 같은 :

나는 서비스가 나는 서비스를 주입 한 내 구성 요소에서

constructor(private http: HttpClient){} 
hasPermission(operation: string, objects: string): Observable<Permission> { 
    let queryStr: HttpParams = new HttpParams(); 
    queryStr = queryStr.set(“operation”,operation); 
    queryStr = queryStr.set(“objects”,objects); 
    return this.http.get<Permission>(this.url + permissionType, { params: queryStr }); 
} 

및 I는 다음과 같이 사용 :

hasCreatePermission(){ 
     this.permissionsService.hasPermission("C","Categories").subscribe(
      res => { 
       this.canCreate = res.data[0].result; 
      }, (err: HttpErrorResponse) => { 
      if (err.error instanceof Error) { 
       console.log('An error occurred:', err.error.message); 
      } else { 
      console.log(`Backend returned code ${err.status}, body was: ${err.error}`); 
     } 
    }); 
} 

약속이 완료되면 canCreate 변수에 권한 값이 설정됩니다.

이 변수는 내 템플릿에서 단추와 같은 일부 구성 요소를 숨기거나 표시하는 데 사용됩니다.

이 모든 것들이 올바르게 작동합니다. 그래서 내 질문은 .. 거기에 어떤 방법이있다 각도로 동기화 할 수 있습니까?

This.canCreate = this.servicePermission.hasPermission ... :

같은 방법을 호출 할 수합니다. 약속이 해결 될 때까지 실행을 contiune하지 않기 때문에 템플릿이 렌더링되기 전에 결과를 얻을 수 있습니다.

권한으로 인해 몇 초 후에 사라질 버튼이있는 페이지를 표시 할 수 없기 때문에이 기능이 필요합니다.

서버에서 데이터를 가져 오는 것과 같이 백엔드에 대한 호출이 비동기 여야한다는 데 동의하지만이 경우 페이지를 적절하게 렌더링 할 수 있어야합니다.

답변

1

해결 된 값에 따라 구성 요소를 렌더링 할 때까지 기다릴 필요가 없습니다.

은 무엇 당신이해야하는 등의 버튼을 렌더링 조건부 구성 요소 마크 업에 async pipe를 사용하고있다

뭔가 같은

<button [hidden]="!canCreate | async">Click me if allowed!</button>

0

의 HTTP 요청을 반환 Obseravbles 브라우저를 막지하기 위해 . 구성 요소/템플릿의 로딩을 지연시키려는 경우 각도로 리졸버를 사용하십시오. 이 시나리오를 위해 특별히 제작되었습니다.

리졸버 및 프리 페치에 대한 추가 정보 https://angular.io/guide/router#resolve-pre-fetching-component-data