2013-05-12 8 views
2

Мне нужно управлять глобальным состоянием нескольких веб-компонентов на моей веб-странице. (например, каждый веб-компонент имеет кнопку «выбрать»/функцию и я отслеживаю компоненты, чтобы убедиться, что за один раз выбран только один компонент.)Как получить ссылку на поток событий изнутри обработчика событий?

Для управления глобальным состоянием моих компонентов каждый веб-компонент обеспечивает поток события для обычного обработчика в моем основном веб-приложении. К сожалению, мне нужен мой обработчик, чтобы узнать, из какого потока/веб-компонента он был вызван, чтобы управлять глобальным состоянием. Как мой обработчик может получить эту информацию?

Вот мой пример кода:

// _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

спасибо мне нравится второй вариант Сработало понравился шарм –

+0

Добро пожаловать . Рад, что смог помочь. –

 Смежные вопросы

  • Нет связанных вопросов^_^