我们可以在一个呼叫中取消流的每个订阅吗?
在大多数飞镖示例中,我们可以看到,未订阅的主要方法是直接从StreamSubscription直接调用 CANCEL 方法,但是我们需要存储这些订阅...
var s = myElement.onClick.listen(myHandler); //storing the sub
s.Cancel() //unsuscribing the handler
有没有一种方法可以取消给定流的每个订阅而不存储它们?
看起来像这样的东西:
myElement.onClick.subscriptions.forEach((s)=> s.Cancel());
使用装饰器模式:
class MyStream<T> implements Stream<T>{
Stream<T> _stream;
List<StreamSubscription<T>> _subs;
/*
use noSuchMethod to pass all calls directly to _stream,
and simply override the call to listen, and add a new method to removeAllListeners
*/
StreamSubscription<T> listen(handler){
var sub = _stream.listen(handler);
_subs.add(sub);
return sub;
}
void removeAllListeners(){
_subs.forEach((s) => s.cancel());
_subs.clear();
}
}
如果您想在HTML元素上使用它,则可以通过装饰Element
在MyElement
上完全相同的装饰器图案。示例:
class MyElement implements Element{
Element _element;
/*
use noSuchMethod to pass all calls directly to _element and simply override
the event streams you want to be able to removeAllListeners from
*/
MyElement(Element element){
_element = element;
_onClick = new MyStream<MouseEvent>(_element.onClick);
}
MyStream<MouseEvent> _onClick;
MyStream<MouseEvent> get onClick => _onClick; //override the original stream getter here :)
}
然后相应使用:
var superDivElement = new MyElement(new DivElement());
superDivElement.onClick.listen(handler);
//...
superDivElement.onClick.removeAllListeners();
您必须存储参考才能取消事件。