2016-07-23 110 views
1

我有這樣一個角度組件:RxJS,Angular:無法接收其他方法的訂閱結果

它創建一個正常的ReplaySubject。 (見constructor)。 然後一些其他組件通過方法getSubject()獲得subject並訂閱它。另一個組件通過setValue設置新值。這個值應該被訂戶接收。但是,這不會發生。它什麼也收不到,甚至沒有錯誤。

@Injectable() 
export class BreadcrumbService { 

    subject: ReplaySubject<string>; 

    constructor() { 
     this.subject = new ReplaySubject<string>(); 
     console.log('Step 1: Subject created'); 
    } 

    getSubject(): ReplaySubject<string> { 
     console.log('Step 2: Return subject for subscribing'); 
     return this.subject; 
    } 

    setValue(title: string) { 
     console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.'); 
     this.subject.next(title); 
    } 
} 

如果我將訂閱放在setValue()之內,它就會按預期工作。

這裏是我的組件應該接收訂閱:

export class BreadcrumbComponent implements OnInit { 

    constructor(
     private breadcrumbsService: BreadcrumbService 
    ) {} 

    ngOnInit() { 
     this.breadcrumbsService.getSubject() 
      .subscribe(
       success => { 
        console.log(success); // is never called 
       }, 
       error => { 
        console.log(error); // is never called 
       } 
      ); 
    } 
} 

我的用戶如何獲得這個價值?

+0

你檢查了@Gunter的說法嗎?除了一切應該沒有任何錯誤的工作。 – micronyks

回答

0

我還沒有看到一個錯誤,但 我假設你不止一次提供BreadcrumbService
Angular2爲每個提供者維護一個實例。如果您提供多次,則會有多個實例。我假設調用setValue的實例與BreadcrumbComponent得到的實例不同。

如果您希望共享實例在公共父級(例如根組件)上提供共享實例。

+1

感謝您的回答!你是絕對正確的。我提供了兩次'BreadcrumbService'。 –

0

請嘗試使用Observables來代替。

@Injectable() 
export class BreadcrumbService { 

    subject: Observables<string>; 

    constructor() { 
     this.subject = new Observables<string>(); 
     console.log('Step 1: Subject created'); 
    } 

    getSubject(): Observables<string> { 
     console.log('Step 2: Return subject for subscribing'); 
     return this.subject; 
    } 

    setValue(title: string) { 
     console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.'); 
     this.subject.emit(title); 
    } 
}