2016-11-06 4 views
1

asObservable을 노출하는 상점이 있습니다. 뷰는이 뷰에 가입하고 데이터를 표시합니다. Singleton 서비스로 변경 했으므로 첫 번째로드에서 작업 중이었습니다. 먼저 데이터가 표시되지 않고 구독 이벤트가 트리거되지 않은 페이지로 이동했습니다. subject.next가 업데이트되고 뷰 업데이트 및 모든 것이 훌륭한 호출을 유발하는 데이터에 대한 작업을 수행 한 후Observer가 컴포넌트에 처음로드 할 때 구독하지 않습니다.

이것은 경쟁 조건 문제가 아니며 페이지의 생성자가 호출 될 때 데이터가 저장소에 있음을 보장합니다. 구독하는

  • 성분 생성자라고 올바른 데이터라고 함)

    1. 데이터 서버
    2. subject.next을 (로드 : 이벤트

      순서는 다음과 같다 (디버깅시 확인) 인 옵저버

    구독 이벤트가 발생하지 않으며 저장소에 존재하더라도 데이터가 채워지지 않습니다. 그런 다음 목록에서 일종의 crud 연산을 수행하면 모든 것이 예상대로 계단식으로 처리되고 next()가 호출되고 가입 ​​이벤트가 발생합니다.

    페이지를로드 할 때 데이터를 읽도록 페이지를 가져올 수 있습니까?

    data.store

    protected _subject$: Subject<Array<any>>; 
    this._subject$.next(newData); // confirmed via console this happens with good data 
    
    get contacts$(): Observable<any> { 
        return this._subject$.asObservable(); 
    } 
    

    구성 요소 - 나는 모두 같은 결과

    // this happens after the above data is already set 
    this.contacts$.subscribe(data => { 
        // this block does not execute on page load 
        }); 
    
  • +0

    몇 가지 코드를 추가 할 수 있습니까? – echonax

    +1

    이 산문 묘사에서 정확히 무슨 일이 벌어지고 있는지 전체 그림을 얻기가 어렵습니다. 플 런커에서 재생산 할 수 있습니까? –

    +0

    관련 비트를 추가 했으므로이 프로세스를 관리하는 코드가별로 없습니다. –

    답변

    3
    를 생성자와 ngAfterViewInit에 아래 블록을 넣어 시도했습니다

    이벤트 순서는 다음과 같습니다 (디버깅)

    1. 데이터 서버로부터로드
    2. subject.next()가 관찰자에게 구독
    3. 성분 생성자 호출 올바른 데이터라고하면

    그것은 바닐라 것부터 Subject은 아무것도 버퍼링하지 않습니다. 정확한 시간에 구독 한 사람이 없으면 메시지가 방출되고 메시지는 영원히 사라지고 아무도 메시지를받지 못합니다. 당신이 (모든 가입자) 버퍼의 마지막 메시지를 유지하려면

    는, 당신은이 BehaviorSubject 또는 의미 적

    import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 
    import { ReplaySubject } from 'rxjs/ReplaySubject'; 
    
    sub1 = new BahaviorSubject<any>(null); 
    sub2 = new ReplaySubject<any>(1); 
    

    ReplaySubject

    에서, BehaviorSubject은 시간이 지남에 따라 변화하는 값을 나타냅니다 사용할 수 있으며 초기화 초기 값. 다음 항목이 그것을 밀어 낼 때까지 마지막 항목은 항상 버퍼링됩니다.

    ReplaySubject의 의미는 방출 된 항목 수를 버퍼 크기까지 버퍼링하고 구독 할 때 구독자에게 모두 보내도록하는 것입니다.버퍼 크기로 ReplaySubject을 초기화 할 수 있습니다. 버퍼 크기를 1로 설정하면 BehaviorSubject처럼 동작합니다 (값으로 초기화 할 필요는 없습니다).

    관련 문제