【问题标题】:Dart HTML: Clear onClick listeners on ButtonDart HTML:清除按钮上的 onClick 侦听器
【发布时间】:2015-08-30 11:42:01
【问题描述】:

是否有某种方法可以清除 Dart HTML 中按钮上的 onClick 侦听器,而无需跟踪所有侦听器?

每次显示某个 div 并将 onClick 侦听器附加到某些按钮时都会执行此代码,如果它被隐藏并再次显示,则会附加更多 onClick 侦听器,并且还会调用不再有效的旧 onClick 事件.

querySelectorAll("button.update-something").forEach((ButtonElement b) {
    b.onClick.listen((e) {
        // Do Stuff
    });
}

有没有办法清除现有的 onClick 侦听器或覆盖现有的 onClick 侦听器,而无需跟踪以前的 onClick 侦听器?

【问题讨论】:

    标签: events onclick dart dart-html


    【解决方案1】:

    跟踪你的意思可能是

    List<StreamSubscriptions> subscriptions = [];
    
    querySelectorAll("button.update-something").forEach((ButtonElement b) {
        subscriptions.add(b.onClick.listen((e) {
            // Do Stuff
        }));
    }
    

    我猜这就是你要找的东西

    querySelectorAll("button.update-something").forEach((ButtonElement b) {
        b.addEventListener('click', clickHandler);
    }
    
    void clickHandler(e) {
      // Do stuff
    }
    
    querySelectorAll("button.update-something").forEach((ButtonElement b) {
        b.removeEventListener('click', clickHandler);
    }
    

    【讨论】:

    • 使用 addEventListener 和 removeEventListener,看来你现在不得不牺牲匿名事件监听器了。如果是这样的话,我会坚持跟踪听众。谢谢甘特!
    • 我自己还没有使用过这种方法,但我怀疑相等比较可能不适用于内联函数,因此为了安全起见,我在答案中使用了命名函数变体。如果它也适用于匿名函数,应该很容易尝试。
    • 感谢 dart 出色的语法,可以在跟踪时取消订阅所有订阅:subscriptions..forEach((StreamSubscription sub) =&gt; sub.cancel())..clear();
    • 好的,我以为这就是您所说的“跟踪”,也是您想要避免的。
    • 是的,我一直在寻找像b.onClick.listeners.clear() 这样更简单的东西,假设addEventListenerremoveEventListener 是唯一的其他方法,我宁愿坚持订阅方式,似乎比处理“低级”javascript事件更干净。
    猜你喜欢
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2011-11-27
    • 2015-06-20
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多