2016-10-31 33 views
1

我正在學習Angular2和RxJS,並且正在關注其他人的應用程序。在他的申請中,他有兩個模塊。第一個是asObservable.ts文件:重寫代碼以使BehaviorSubject與Observable訂閱

asObservable.ts

export function asObservable(subject: Subject) { 
    return new Observable(fn => subject.subscribe(fn)); 
} 

第二是創建一個新的BehaviorSubject RxJS對象,並將其發送到asObservable.ts模塊

待辦事項店內一個文件.service.ts

import {asObservable} from "./asObservable"; 
import {List} from "immutable"; 
import {Todo} from "./todo"; 
// Todo is a customized class 

@Injectable() 
export class TodoStore { 

    private _todos: BehaviorSubject<List<Todo>> = new BehaviorSubject(List([])); 

    get todos() { 
     return asObservable(this._todos); 
    } 

    loadInitialData() { 
     this.todoBackendService.getAllTodos() 
      .subscribe(
       res => { 
        let todos = (<Object[]>res.json()).map((todo: any) => 
         new Todo({id:todo.id, description:todo.description, completed: todo.completed})); 
        this._todos.next(List(todos)); 
       }, 
       err => console.log("Error retrieving Todos") 
      ) 
    } 
    //unnecessary code omitted 
} 

我想消除asObservable.ts文件,並在一個單一的功能進行訂閱功能,但我無法弄清楚它是如何完成的,是這樣的:

get todos() { 
    return new Observable(Subject.subscribe(this._todos)); 
} 

這顯然是行不通的。有人能給我一些正確的方法來做到這一點,並簡要解釋我做錯了什麼?

+1

'返回this._todos.asObservable ();'? –

+0

@HarryNinh我的道歉,我添加了其他代碼,顯示this._todos.next(),爲了做到這一點,我需要訂閱。這是目標的一部分是創建一個Observable並訂閱。 'this._todos.asObservable()'仍然可以工作嗎? –

+2

還是不明白你的觀點。如果你訂閱了'this._todos.asObservable()',只要'this._todos.next(...)'被調用,你就會收到更新。 –

回答

3

在我看來,原作者並不知道已經有asObservable()方法。但是,他的版本需要Subject對我來說沒有意義,這只是一個非常簡單的事情的複雜方式。另外,這種方式你不能退訂。

我反而堅持原來的asObservable()。其目的是爲了隱藏您使用的是Subject內部的事實,你可以公開只是一個可觀察:

export class TodoStore { 
    // ... 
    observable: Observable; 

    constructor() { 
     this.observable = this._todos.asObservable(); 
    } 
} 

然後訂閱像其他地方的作品:

let store = // ... TodoStore from DI or whatever 
store.observable.subscribe(val => console.log(val)); 
+0

你說得對,我不知道有'.asObservable()'方法。我一直在學習Angular 2和Typescript大約一個月,並且有很多事情要做。 –