不符合活动的每个处理程序



我们可以在一个呼叫中取消流的每个订阅吗?

在大多数飞镖示例中,我们可以看到,未订阅的主要方法是直接从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元素上使用它,则可以通过装饰ElementMyElement上完全相同的装饰器图案。示例:

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();

您必须存储参考才能取消事件。

相关内容

  • 没有找到相关文章

最新更新