[英]When to use Observable vs EventEmitter vs Dot Rule for change detection in angular2
我看到有三種方法可以管理Angular2中的變更檢測。
觀測
@Injectable() export class TodosService { todos$: Observable<Array<Todo>>; private _todosObserver: any; private _dataStore: { todos: Array<Todo> }; constructor(private _http: Http) { // Create Observable Stream to output our data this.todos$ = new Observable(observer => this._todosObserver = observer).share(); this._dataStore = { todos: [] }; } }
EventEmitter。
@Injectable() class NameService { name: any; nameChange: EventEmitter = new EventEmitter(); constructor() { this.name = "Jack"; } change(){ this.name = "Jane"; this.nameChange.emit(this.name); } }
點規則
export interface Info { name:string; } @Injectable() class NameService { info: Info = { name : "Jack" }; change(){ this.info.name = "Jane"; } }
我的問題是,訂閱觀看數據變化時,所有三種實現都可以工作。 你如何決定何時使用一個而不是另一個,以及每個的缺點是什么。
我們試着給你一些提示......
最后一種方法的主要問題是它不適用於原始類型,而只適用於引用。 所以我不推薦它......
我認為EventEmitter
/ Observable
是實現和處理自定義事件的正確方法。 它還鏈接到組件本身( @Ouput
),模板中的雙向映射(語法[(...)]
)和async
管道。
從文檔中, EventEmitter
使用Observable
但提供了一個適配器,使其按照此處的指定工作: https : //github.com/jhusain/observable-spec 。 在查看EventEmitter
類之后,它擴展了Subject
類。 它不僅僅是一個簡單的Observable
。 有關詳細信息,請參閱此鏈接: https : //github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md
關於自定義observable的創建,我會說:只有在需要特定的東西時才創建自己的observable。 否則使用EventEmitter
類。 但是你可以用EventEmitter
類和可觀察的運算符做很多事情。
總而言之,在這樣一個“簡單”的用例中,事情並不那么明顯,但在更復雜的場景中, EventEmitter
/ Observable
允許使用運算符定義處理鏈。 經典示例是根據input
的值更新列表(此處在字段的this.term
定義ngModel
):
this.term.valueChanges
.debounceTime(400)
.flatMap(term => this.dataService.getItems(term))
.subscribe(items => this.items = items);
這篇來自Christoph Burgdorf的精彩博文可以為您提供有關觀察者可以處理的內容的一些想法: http : //blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html 。
希望它對你有幫助,蒂埃里
除此之外,我們還需要使用Event Emitter來實現子組件和父組件之間的事件綁定。 我們更好地避免訂閱它,就像將來不推薦使用它一樣,代碼需要再次更改。 因此,除了子組件和父組件之間的事件綁定之外,最好避免使用事件發射器。 在其他情況下,最好使用Observable。 請查看此鏈接了解詳細信息... https://www.bennadel.com/blog/3038-eventemitter-is-an-rxjs-observable-stream-in-angular-2-beta-6.htm#comments_47949
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.