2016-10-05 3 views
1

나는 angular2 구성 요소에서 비동기 파이프를 사용하고 observable을 전달하는 경우가 있습니다. 그건 잘 작동합니다.Angular2 Async Pipe의 구독 변경

구성 요소가 아직 '살아있다', 즉 : OnDestroy가 호출되지 않아 (따라서 비동기 파이프가 구독 됨) 관찰 가능 목록에서 가입을 취소하고 다른 구독을 구독합니다.

어떻게하면됩니까?

여기이 경우 노출 일부 의사 코드입니다 :

@Component({ 
    selector: 'pack', 
    template: ` 
    <wolf *ngFor="let wolf of pack | async"> 
     ... 
    </wolf> 
    ` 
}) 
export class PackComponent implements DoCheck { 

    pack; 

    constructor(){ 
     this.pack = Observable.of(northwesthernWolves: Wolf[]) 
    } 

    onDoCheck() { 
     if(some condition) { 
     this.pack = Observable.of(redWolves: Wolf[]) 
     } 
    } 
} 

답변

3

프레임 워크가 출시 된 점을 감안를, 이미 돌봐 있다고 가정하는 것이 안전합니다. 그리고 실제로, it is so는 :

클래스 속성에 할당 된 새 관찰
... 
if (obj !== this._obj) { 
    this._dispose(); 
    return this.transform(obj); 
} 
... 

, 기존의 하나 async 파이프에 의해 자동으로 탈퇴입니다.

반대의 동작은 메모리 누수로 이어질 수 있으며 버그로 간주 될 수 있습니다.

+0

이것은 대답하지 않습니다. 구성 요소 클래스 내에서 비동기 구독을 변경해야합니다. 이러한 메서드는 비동기 파이프 클래스 내에서 선언되어 실행됩니다. – Francisco

+0

대답의 요점은 당신이 이것을 신경 쓸 필요가 없다는 것이고, 당신이'this.pack = Observable.of (redWolves : Wolf [])'를 할 때 프레임 워크가 여러분을 위해 이것을 수행한다는 것입니다. 수동으로 구독을 취소해야한다고 생각한 이유는 무엇입니까? 게시 한 코드와 관련된 문제가 있습니까? – estus

+0

내가 그렇게하면 브라우저가 차단됩니다. 구성 요소 클래스에서 구독을 변경해야하는 경우가 있습니다. 세부 사항 : 초기 구독은 SSE 이벤트이지만 약속 (두 서버 모두)에 대한 콜백도 실행합니다. SSEvents 스트림이 정상적으로 작동하는 동안 콜백이 호출되면 파이프 구독을 promise (배열)로 다시 설정하려고합니다. 나는 그 일을하기 위해 탈퇴해야 할지도 모른다고 믿는다. 그러나 확실하지는 않다. – Francisco

관련 문제