Aurelia委托与触发器:您如何知道何时使用委托或触发器?


69

我正在尝试学习如何使用Aurelia框架。这样做,我读的文档在这里对他们的结合事件的方法。该文档建议默认使用委托。我分叉了他们在其博客文章之一中提供的“ punkr”,并添加了一些内容。满满的朋克就在这里


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

如您在插件中所看到的,blur.trigger / click.delegate / click.trigger均会触发事件,而blur.delegate不会。

为什么会这样呢?

您如何确定什么时候.delegate不工作(当然无需手动测试)?

Answers:


107

使用delegate除非你不能使用delegate

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

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

这是模糊MDN页面。它具有有关模糊和聚焦事件的事件委托技术的更多信息。

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

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

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

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

使用triggerclick在某些iOS的用例:

iOS版确实比上其他元素不泡点击事件abuttoninputselect。如果您订阅click的是非输入元素(如a)div,并且定位到iOS,请使用triggerbinding命令。更多信息在这里这里


3
使用触发器的其他原因:如果您支持Internet Explorer,并且将按钮设置为disabled,则需要将click事件设置为trigger,而不是delegate。如果使用delegate,则click即使单击了该按钮,该事件仍会在单击该按钮时触发。有关更多详细信息,请参见此
Vaccano

我不同意这里的文档。有触发器的陷阱与触发器不存在。我认为,对于大多数应用程序而言,禁用按钮会意外触发事件或按钮无法在iOS上正常运行,这比大多数应用程序的性能问题要大,尤其是当您谈论少数元素时。在有成排的桌子上工作?仔细考虑代表。否则,更安全地使用扳机。
mgiesa

为什么建议使用trigger.click而不是在元素上设置cursor:指针?
Dan Pettersson


1

对此,如果Aurelia在捕获阶段监听事件,则模糊委托将起作用,但这在Aurelia中不是可实现的atm。如果有人可以提供一些如何捕获奥雷利亚事件的提示,那将很有趣

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

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

2
以下是如何capture结合绑定命令delegate并将trigger其添加到aurelia
Jeremy Danyow

这是正式的吗?
bigopon

2
对于任何遇到此问题的人,现在都已正式内置了capture binding命令。语法为click.capture='expression'
bigopon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.