【问题标题】:Aurelia delegate vs trigger: how do you know when to use delegate or trigger?Aurelia 委托与触发器:您如何知道何时使用委托或触发器?
【发布时间】:2016-02-27 12:27:53
【问题描述】:

我正在尝试学习如何使用 Aurelia 框架。这样做时,我正在阅读文档 here 关于他们绑定事件的方法。文档建议默认使用委托。我已经分叉了他们在其中一篇博客文章中提供的 plunkr,并在其中添加了一些内容。完整的 plunk 是here


app.html

<template>
    <input value.bind="pageInput" blur.delegate="showAlert()" placeholder="delegate()" />
    <input value.bind="pageInput" blur.trigger="showAlert()" placeholder="trigger()" />

    <button type="button" click.delegate="showAlert()">delegate()</button>
    <button type="button" click.trigger="showAlert()">trigger()</button>
</template>

app.js

export class App {
  showAlert() {
    alert('showAlert()');
  }
}

正如您在 plunkr 中看到的,blur.trigger/click.delegate/click.trigger 都会触发事件,但 blur.delegate 不会。

为什么会这样?

您如何确定.delegate 何时不起作用(当然无需手动测试)?

【问题讨论】:

    标签: javascript aurelia


    【解决方案1】:

    使用delegate,除非您不能使用delegate

    事件委托是一种用于提高应用程序性能的技术。通过利用大多数 DOM 事件的“冒泡”特性,它大大减少了事件订阅的数量。通过事件委托,处理程序不会附加到单个元素。相反,单个事件处理程序附加到顶级节点,例如 body 元素。当一个事件冒泡到这个共享的顶级处理程序时,事件委托逻辑会根据事件的target 调用适当的处理程序。

    要了解event delegation 是否可以用于特定事件,请谷歌mdn [event name] event。事实上,在任何与网络平台相关的谷歌搜索之前使用mdn 通常会从 Mozilla 开发者网络返回高质量的结果。进入活动的 MDN 页面后,检查活动是否为 bubbles。只有冒泡的事件才能与 Aurelia 的 delegate 绑定命令一起使用。 blurfocusloadunload 事件不会冒泡,因此您需要使用 trigger 绑定命令来订阅这些事件。

    这是MDN page for blur。它包含有关模糊和焦点事件的事件委托技术的更多信息。

    上述一般指导的例外情况:

    当满足以下条件时,在按钮上使用trigger

    1. 您需要禁用该按钮。
    2. 按钮的内容由其他元素组成(而不仅仅是文本)。

    这将确保对禁用按钮的子级的点击不会冒泡到委托事件处理程序。更多信息here.

    在某些 iOS 用例中将trigger 用于click

    iOS 不会在 abuttoninputselect 以外的元素上冒泡点击事件。如果您在 div 等非输入元素上订阅 click 并且针对 iOS,请使用 trigger 绑定命令。 更多信息herehere

    【讨论】:

    • 使用触发器的其他原因:如果您支持 Internet Explorer,并且您将按钮设置为 disabled,那么您需要将您的 click 事件设置为 trigger,而不是 @987654353 @。如果你使用delegate,那么当按钮被点击时click事件仍然会触发,即使按钮被禁用。有关详细信息,请参阅此问题:github.com/aurelia/binding/issues/163
    • 我不同意这里的文档。委托存在的陷阱不存在于触发器中。我认为对于大多数应用程序而言,禁用按钮触发事件或按钮完全无法在 iOS 上运行是一个比性能更大的问题,尤其是当您谈论少数元素时。在有大量行的桌子上工作?仔细考虑委托。否则,使用触发器更安全。
    • 为什么建议使用 trigger.click 而不是设置 cursor: 元素上的指针?
    • bubbles 是什么意思? stackoverflow.com/questions/4616694/…
    【解决方案2】:

    关于这一点,如果 Aurelia 在捕获阶段侦听事件,则模糊委托将起作用,但这在 Aurelia 中是不可行的。如果有人可以提供一些提示如何在 Aurelia 中捕获事件会很有趣

    在这种情况下,以下将起作用:

    <template>
        <input blur.delegate-capture='showAlert()' />
    </template>
    

    【讨论】:

    • 这是一个capture 绑定命令如何与delegatetrigger 一起添加到aurelia 的原型:gist.run/?id=196c99652a28d571527a8fff63297308
    • 这是正式的吗?
    • 对于任何来这个问题的人,捕获绑定命令现在是官方内置的。语法是click.capture='expression'
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多