2016-09-06 3 views
4

서버에서 가져온 데이터를 처리하는 각도 2 RC5의 사용자 지정 파이프가 구현되었습니다. 내가 가지고있는 문제는 파이프가 서버에 호출하는 곳인 ngOnInit 전에 실행된다는 것입니다.ngOnInit 전에 실행되는 각도 2 파이프

테스트에서 이미 채워진 목록을 파이프에 전달했으며 모든 것이 예상대로 작동합니다. 유일한 문제는 페이지가 렌더링 될 때 파이프가 실행된다는 것입니다. 그리고 그 경우 목록은 비어 있습니다.

페이지 렌더링을 지연시켜 파이프가 실행될 때 서버에서 데이터를 가져올 수있는 방법이 있습니까?

내 코드의 샘플입니다

ngOnInit() { 
    Observable.forkJoin([ 
     this.testService.get(), 
     this.multilingualService.get(localStorage.getItem('currentPage')) 
    ]).subscribe(servicesResult => { 
     this.mainList = servicesResult[0]; 
     this.pageMultilinguals = servicesResult[1]; 
    }, 
    error => this.handleError(error)); 
} 

파이프

구성 요소

@Pipe({name: 'multiLang'}) 
export class MultilingualPipe implements PipeTransform { 
    transform(value: string, pageMultilinguals: Multilingual[], context: number): string { 

     for (let i = 0; i < pageMultilinguals.length; i++) { 
      if (pageMultilinguals[i].reference === value && pageMultilinguals[i].contexTypeId === context) { 
       return pageMultilinguals[i].value; 
      } 
     } 
    } 
} 

템플릿

<span>{{ 'Test' | multiLang: pageMultilinguals: 9 }}</span> 
+0

당신이 빈 데이터에 대한 검사를 추가 할 수 귀하의 파이프에 그냥 그 경우 원래 값을 반환? – rook

+0

저는 템플릿에 간단한 예제를 넣었습니다. 이것은 다국어로 된 참조 용이므로 'Page_Header_1'이라는 참조를 가질 수 있으며 그 값을 되 찾을 수 있습니다. –

답변

3

Angular run이 감지를 변경하면 the pipe가 처음 실행됩니다. 첫 번째 변경 감지 실행 후 ngOnInit()이 호출됩니다. ngOnInit()까지 서버 호출을 지연하면 전혀 도움이되지 않습니다. 왜냐하면 서버 호출을 ngOnInit()으로 호출한다고해서 즉시 응답을 얻지 못하기 때문입니다. HTTP 요청은 비동기 호출이며 응답은 결국 발생하지만 ngOnInit()은 이미 오랜 시간 완료됩니다.

나는 당신의 경우에 생각이 전달 된 값이 null 경우는 예외가 발생하지 않도록 단지 null 값에 대한 안전 파이프를 만들기에 충분해야한다 :

@Pipe({name: 'multiLang'}) 
export class MultilingualPipe implements PipeTransform { 
    transform(value: string, pageMultilinguals: Multilingual[], context: number): string { 
     if(!value || !pageMultilinguals || !context) { 
      return null; 
     } 
     for (let i = 0; i < pageMultilinguals.length; i++) { 
      if (pageMultilinguals[i].reference === value && pageMultilinguals[i].contexTypeId === context) { 
       return pageMultilinguals[i].value; 
      } 
     } 
    } 
} 
+0

답변 해 주셔서 감사합니다. 따라서 페이지가로드 될 때 데이터가 필요한 경우 서버에서 데이터를 "대기"하는 파이프를 실제로는 가질 수 없습니다. 필자의 경우에는 항상 데이터가 있어야하므로 접근 방식을 약간 변경해야 할 수도 있습니다. –

+0

조금만 설명하기 위해 이것은 번역 가능한 용어를 가지고 테스트 한 작은 기능입니다. 파이프의 작업은 단순히 참조를 전달하고 선택한 언어의 텍스트가 반환됩니다. "페이지 용어"'ngOnInit'을 검색하려고했지만 파이프가 "지연"되어 데이터를 기다릴 수 없다는 것을 지적했습니다. –

+1

나는 이것이 왜 당신에게 문제를 일으키는 지 아직 이해하지 못합니다. Angular2 변경 감지가 변경 사항을 감지하면 (기본값) 또는 변경 감지가 실행될 때마다 (불순한 파이프의 경우) 파이프가 호출됩니다. 그게 전부입니다. –