我很想知道Enyo如何发生事件。假设一个简单的DOM树,父节点有两个子节点。我想做的就是将从子级1生成的自定义事件传播到子级2.我已经为此创建了一个示例。
enyo.kind({
name: "MySample",
kind: "moon.Panels",
classes: "moon",
pattern:"activity",
components: [{kind: "moon.Panel",
title: "Hello World!",headerComponents: [
{kind: "moon.IconButton", src: "assets/icon-like.png"}
],
components: [
{kind: "moon.Input",placeholder: "type time",onchange :"handleInput"},
{kind:"ClockSample", name:'time'}
]}
],
handleInput: function(inSender, inEvent) {
// body...
var val=inSender.getValue();
var evt = document.createEvent("Event");
evt.initEvent("myEvent",true,true);
evt.val=val;
var target=this.$.time.hasNode();
target.dispatchEvent(evt);
//enyo.dispatcher.dispatch(evt);
}
});
enyo.kind({
name: "ClockSample",
components: [
{kind: "moon.Clock", name:"clock"}
],
create:function(){
this.inherited(arguments);
enyo.dispatcher.listen(document, "myEvent", this.bindSafely(this.myEventHandler));
},
myEventHandler: function(inSender, inEvent) {
// body...
this.$.clock.setDate(new Date(inSender.val));
}
});
new MySample({fit:true}).renderInto(document.body);
如果我尝试使用“target.dispatchEvent(evt)”,并输入预期的日期格式(即2015年1月1日09:08:07),时钟时间将设置为相同,但行为不相似当尝试使用“enyo.dispatcher.dispatch(evt)”时。
请帮助我了解实现相同的差异和enyo方式。
答案 0 :(得分:1)
首先让我说'不要这样做!'。这不是处理此类问题的正确方法。如果你真的必须在对象之间发送这样的消息使用信号。尝试在兄弟姐妹之间发送消息会破坏封装。
其次,Enyo的正常事件不是DOM事件。如果要在对象上创建事件以进行侦听,则应使用您的事件声明events
块,如下所述:Event Handling。你已经走了DOM事件路线,我不推荐。如果您确实想使用DOM事件,请使用您已经采用的dispatchEvent()
方法。
第三,使用月光石时,只选择暗色或浅色,而不是两者。 Moonstone也需要使用Spotlight库。
最后,使用dispatcher.dispatch()
绕过您使用listen()
执行的dom事件注册。您可以使用信号和侦听自定义事件来克服这种情况。但实际上,只需使用纯信号。试试第一种(不太理想)的方法:http://jsfiddle.net/hfh3z2q4/1/