2016-03-29 92 views
2

我無法堅持觀察者。我有一個創建可觀察元素的組件,並在回調中捕獲觀察者。但後來,我無法得到那個觀察者 - 就好像我有另一個組件實例一樣。Angular2觀察者失蹤

例子:

import {Component} from 'angular2/core'; 
import {Observable} from 'rxjs/Observable'; 

@Component({ 
    selector: 'users-table', 
    templateUrl: './components/users/users-table.html', 
    // template: '<button (click)="popup({value: 2})">Clickme</button>' 
}) 
export class UsersTableComponent { 

    public userClicked$: Observable<any>; 
    public observer: any; 
    public thing: number; 
    constructor() { 

    console.log('Starting UsersTable component'); 
    this.thing = 1; 
    this.userClicked$ = new Observable(observer => { 

     this.thing = 2; 
     console.log('Observer received:', observer); 
     this.observer = observer; 
     this.observer.next('Val 1'); // I receive this in an outside component 
    }).share(); // This supposedly makes the observable *hot* 
    } 

    public handle(value) { 

    console.log('Value:', value); 
    console.log(this.userClicked$); 
    console.log('thing:', this.thing); // This is set back to "1 
    this.observer.next(user);  // this.observer is undefined 
            // so it fails here 
    } 
} 

請注意,我訂閱從另一個組成部分,我得到的是最初的測試值('val 1'

另一個組成部分是聽,訂閱的「ngAfterViewInit 「,基本上是這樣的:

this.usersTableComponent.userClicked$.subscribe(val => { console.log('heard ya:' val); }); 

我是否缺少明顯的東西?我可以以某種方式直接使用點擊處理程序來傳遞點擊的用戶事物嗎? (表中的一行)?

Angular2測試版8

回答

1

回調傳遞給new Observable(observer => { ... })this.userClicked$.subscribe(...)被調用時,纔會執行,因此,沒有用戶就沒有this.observer

就跳過發射在這種情況下:

this.observer && this.observer.next(user); 
+0

好吧,我從另一個組件訂閱這一點 - 我理解的初始值。我甚至使它變熱,讓我更新。 – Zlatko

+0

只需檢查'this.observer && this.observer.next(user);'如果沒有訂閱者,那麼發佈事件就沒有意義。 –

+0

謝謝。我已經編輯了這個問題,以清楚地表明我*訂閱了*,並* * *獲得了我發佈的初始_Val 1_。後者不會被髮送,因爲看起來好像我的模板看到了組件的不同實例。 – Zlatko