2016-12-14 60 views

回答

3

这有点复杂,因为CustomEvent是相当可定制的,可以在任何时间发送。

Aurelia docs说delegate是首选。但是,delegate的执行依赖于<body>元素的全局事件处理程序,因此不能始终使用。调度一个事件的元素,然后该事件冒泡到<body>,到达DOM中所有可见的根。因此,为了使delegate工作:

  1. 冒泡有CustomEvent
  2. 发件人元(其中dispatchEvent被称为上)上启用要附加到DOM树。因此事件实际上在鼓泡时达到<body>

1点只是设置的事情,让我们看看2.这取决于如果该事件被后视图模型被附加到DOM(前attached()回调)或之前分派。如果之前,那么delegate将不起作用,请使用trigger。否则使用delegate

偏偏之前附着到DOM→使用trigger

  • 构造
  • 路由器回调:canActivate()activate()
  • 初始bindig回调:bind(),改变的回调bindables,xxxChanged()

Happens cert只需附加→使用delegate:基本上内置的基于用户的DOM事件(点击,选择,更改等)。原因:因为用户只能与我们的视图模型进行交互,如果它已经在DOM中。

1

对不起,我不能发表评论,balazska的答案很好,但它假设你清楚地了解事件中的每件事情是如何工作的。如果你听自定义事件对这样的事情

<div repeat.for='items of my_1000_items_collection' custom-event.trigger='doIt()'></div> 

您注册1000项听者为了简化他的版本。在这种情况下,如果需要更好地使用委托并调整代码,它可能会提高应用程序的性能。

您也可以使用capture,这是目前没有记录。(它的方式来释放)这才是真正的Capture Event

<div repeat.for='items of my_1000_items_collection' custom-event.capture='doIt()'></div> 
+0

,但如果'被发送定制event'“早”(构造函数,绑定,激活等),then'trigger'是唯一的出路捕捉该事件。 – balazska

+0

我还没有遇到组件设置阶段需要事件的情况,但这将是有用的方法。 – bigopon

+0

我刚刚做到了,这就是为什么我首先想到了这个问题。说到结核:在绑定数据被转换之后,'bindized()'方法发送'initialized'事件。 – balazska