2013-05-12 63 views
2

我需要在我的網頁上管理許多Web組件的全局狀態。 (例如,每個Web組件都有一個「選擇」按鈕/功能,並跟蹤組件以確保一次只選擇一個組件)。如何從事件處理程序中獲取對事件流的引用?

要管理我的組件的全局狀態,每個Web組件都提供事件給我的主要網絡應用程序中的常見處理程序。不幸的是,爲了管理全局狀態,我需要我的處理程序來了解它被調用的流/ web組件。我的處理程序如何獲取這些信息?

這裏是我的示例代碼:

// _webComponents is a list of references to each component. 
// getStream() gets a stream of events from each component. 
// connections is a list of streams from all my web components. 
_webComponents.forEach((connection)=>connections.add(connection.getStream())); 
connections.forEach((Stream<String> connection)=>connection.listen(eventHandler)); 


void eventHandler(webComponentEvent){ 
    // ?? How do i find out which web component the event came from ?? 
    // ToDo: use event and web component info to manage a global state of web components. 
} 

回答

3

如果我理解正確的,你想知道在你的處理器的發送者,對吧?

有兩種選擇。第一個是發送者作爲數據的一部分:

class Dog { // controller and stream initialization removed for brevity 
    Stream get onBark => ...; 
    void bark(){ 
    // of course, you can have a typed object instead of map 
    _barkController.add({'sender': this, 'data': 'woof'}); 
    } 
} 

// attach to source 
var dog = new Dog(); 
dog.onBark.listen((event) { 
    sender = event['sender']; 
    data = event['data']; 
    ... 
}); 

另一種選擇是綁定發件人在閉包中。這並不需要你改變流的類型(所以你還是有Stream<String>而不是Stream<Map>:。

sources.forEach((src) => src.listen((data) => handleEvent(src, data))); 

void handleEvent(Connection sender, String data) { 
    ... 
} 
+0

非常感謝我喜歡第二個選項,它的工作很喜歡一個魅力 – 2013-05-12 19:44:23

+0

不客氣。 很高興我能幫上忙。 – 2013-05-12 19:49:19

相關問題