enyo.dispatch(e)和target.dispatchEvent(e)web api之间的行为差​​异

时间:2014-12-08 11:00:33

标签: javascript asp.net-web-api enyo

我很想知道Enyo如何发生事件。假设一个简单的DOM树,父节点有两个子节点。我想做的就是将从子级1生成的自定义事件传播到子级2.我已经为此创建了一个示例。

http://jsfiddle.net/hfh3z2q4/

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方式。

1 个答案:

答案 0 :(得分:1)

首先让我说'不要这样做!'。这不是处理此类问题的正确方法。如果你真的必须在对象之间发送这样的消息使用信号。尝试在兄弟姐妹之间发送消息会破坏封装。

其次,Enyo的正常事件不是DOM事件。如果要在对象上创建事件以进行侦听,则应使用您的事件声明events块,如下所述:Event Handling。你已经走了DOM事件路线,我不推荐。如果您确实想使用DOM事件,请使用您已经采用的dispatchEvent()方法。

第三,使用月光石时,只选择暗色或浅色,而不是两者。 Moonstone也需要使用Spotlight库。

最后,使用dispatcher.dispatch()绕过您使用listen()执行的dom事件注册。您可以使用信号和侦听自定义事件来克服这种情况。但实际上,只需使用纯信号。试试第一种(不太理想)的方法:http://jsfiddle.net/hfh3z2q4/1/