RxJS fromEvent

2020-10-13 18:42 更新

創(chuàng)建一個 Observable,它發(fā)出來自給定事件目標的特定類型的事件。

fromEvent<T>(target: FromEventTarget<T>, eventName: string, options?: EventListenerOptions | ((...args: any[]) => T), resultSelector?: (...args: any[]) => T): Observable<T>

參量

目標 DOM EventTarget,Node.js EventEmitter,類似于 JQuery 的事件目標,NodeList 或 HTMLCollection 來附加事件處理程序。
eventName 所關注的事件名稱,由發(fā)出 target
選項 可選的。默認值為 undefined。傳遞給 addEventListener 的選項
resultSelector 可選的。默認值為 undefined。類型:(...args: any[]) => T。

returns

Observable<T>

描述

根據(jù) DOM 事件或 Node.js EventEmitter 事件或其他事件創(chuàng)建一個Observable。

fromEvent大理石圖

fromEvent接受事件目標作為第一個參數(shù),該目標是具有注冊事件處理函數(shù)的方法的對象。作為第二個參數(shù),它使用指示我們要偵聽的事件類型的字符串。fromEvent支持所選類型的事件目標,下面將對其進行詳細描述。如果您的事件目標與列出的目標不匹配,則應使用 fromEventPattern,可以在任意 API 上使用。對于所支持的 API fromEvent,它們用于添加和刪除事件處理程序函數(shù)的方法具有不同的名稱,但是它們都接受描述事件類型和函數(shù)本身的字符串,只要發(fā)生所述事件,就會調(diào)用該字符串。

每次預訂結果 Observable 時,事件處理函數(shù)將在給定事件類型上注冊到事件目標。當該事件觸發(fā)時,作為第一個參數(shù)傳遞給已注冊函數(shù)的值將由輸出 Observable 發(fā)出。取消訂閱 Observable 時,將從事件目標中取消注冊功能。

請注意,如果事件目標使用多個參數(shù)調(diào)用注冊函數(shù),則第二個及后續(xù)參數(shù)將不會出現(xiàn)在結果流中。為了訪問它們,您可以傳遞到 fromEvent 可選的項目函數(shù),該函數(shù)將與傳遞給事件處理程序的所有參數(shù)一起調(diào)用。然后,輸出 Observable 將發(fā)出由項目函數(shù)返回的值,而不是通常的值。

請記住,下面列出的事件目標是通過鴨子類型檢查的。這意味著,無論您擁有哪種對象,無論您在什么環(huán)境中工作,只要 fromEvent 該對象公開了所描述的方法(當然,它們的行為如上所述),都可以安全地使用該對象。因此,例如,如果 Node.js 庫公開的事件目標與 DOM EventTarget 具有相同的方法名稱,fromEvent 則仍然是一個不錯的選擇。

如果您使用的 API 更具回調(diào)性,則面向事件處理程序(預訂的回調(diào)函數(shù)僅觸發(fā)一次,因此無需手動注銷它),應使用 bindCallbackbindNodeCallback 代替。

fromEvent 支持以下類型的事件目標:

DOM EventTarget

這是帶有 addEventListenerremoveEventListener 方法的對象。

在瀏覽器中,addEventListener 除了事件類型字符串和事件處理程序函數(shù)參數(shù)外,還接受可選的第三個參數(shù),它是一個對象或布爾值,均用于附加配置,如何以及何時調(diào)用傳遞的函數(shù)。當 fromEvent與該類型的事件目標一起使用時,您也可以將此值作為第三個參數(shù)。

Node.js EventEmitter

具有 addListenerremoveListener 方法的對象。

jQuery 風格的事件目標

具有 onoff 方法的對象

DOM 節(jié)點列表

DOM 節(jié)點列表,例如由 document.querySelectorAll或返回 Node.childNodes。

盡管此集合本身不是事件目標,但 fromEvent 將迭代它包含的所有節(jié)點并在每個節(jié)點中安裝事件處理程序功能。返回的 Observable 取消訂閱后,該功能將從所有 Node 中刪除。

DOM HtmlCollection

就像 NodeList 一樣,它是 DOM 節(jié)點的集合。此處,事件處理程序功能也在每個元素中安裝和刪除。

例子

發(fā)出 DOM 文檔上發(fā)生的點擊

import { fromEvent } from 'rxjs';


const clicks = fromEvent(document, 'click');
clicks.subscribe(x => console.log(x));


// Results in:
// MouseEvent object logged to console every time a click
// occurs on the document.

使用帶有捕獲選項的 addEventListener

import { fromEvent } from 'rxjs';


const clicksInDocument = fromEvent(document, 'click', true); // note optional configuration parameter
                                                             // which will be passed to addEventListener
const clicksInDiv = fromEvent(someDivInDocument, 'click');


clicksInDocument.subscribe(() => console.log('document'));
clicksInDiv.subscribe(() => console.log('div'));


// By default events bubble UP in DOM tree, so normally
// when we would click on div in document
// "div" would be logged first and then "document".
// Since we specified optional `capture` option, document
// will catch event when it goes DOWN DOM tree, so console
// will log "document" and then "div".

超載

fromEvent(target: FromEventTarget<T>, eventName: string): Observable<T>

參量: 類型:
目標 類型:FromEventTarget
eventName 類型:string

returnsObservable<T>

fromEvent(target: FromEventTarget<T>, eventName: string, resultSelector: (...args: any[]) => T): Observable<T>

參量: 類型:
目標 類型:FromEventTarget
eventName 類型:string
resultSelector 類型:(...args: any[]) => T

returnsObservable<T> fromEvent(target: FromEventTarget<T>, eventName: string, options: EventListenerOptions): Observable<T>

參量: 類型:
目標 類型:FromEventTarget
eventName 類型:string
選項 類型:EventListenerOptions

returnsObservable<T>

fromEvent(target: FromEventTarget<T>, eventName: string, options: EventListenerOptions, resultSelector: (...args: any[]) => T): Observable<T>

參量: 類型:
目標 類型:FromEventTarget
eventName 類型:string
選項 類型:EventListenerOptions
resultSelector 類型:(...args: any[]) => T
returnsObservable<T>

也可以看看

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號