2014-12-08 6 views
0

나는 Enyo에서 이벤트가 어떻게 발생하는지 알고 싶어합니다. 두 개의 자식 노드가있는 부모 노드가있는 간단한 DOM 트리를 말하십시오. 내가 원하는 것은 자식 1에서 자식 2로 생성 된 사용자 지정 이벤트를 전파하는 것입니다.이 예제를 만들었습니다. enyo.dispatch (e)와 target.dispatchEvent (e) 사이의 동작 차이 웹 API

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일 9시 8분 7초)를 입력하려고하면

http://jsfiddle.net/hfh3z2q4/

, 시계의 시간을 설정합니다 동일하지만 행동은 "enyo.dispatcher.dispatch (evt)"를 사용하려고하면 유사하지 않습니다.

같은 점을 달성하고 차이점을 이해하고 도와주세요.

답변

1

'Do not do that'라고 말하여 시작하겠습니다. 이러한 유형의 문제를 처리하는 올바른 방법은 아닙니다. 객체 사이에 이런 메시지를 보내야한다면 신호를 사용해야합니다. 형제간에 메시지를 보내려고하면 캡슐화가 중단됩니다.

둘째, Enyo의 일반적인 이벤트는 DOM 이벤트가 아닙니다. 수신 대기 할 객체에 대한 이벤트를 만들려면 여기에 설명 된대로 events 블록을 이벤트와 함께 선언해야합니다 (Event Handling). DOM 이벤트 라우트를 사용하지 않았지만 권장하지 않습니다. DOM 이벤트를 사용하려면 이미 취한 dispatchEvent() 메소드를 사용하십시오.

셋째, 월장석을 사용할 때 어두운 색 또는 밝은 색만 선택하십시오. Moonstone은 Spotlight 라이브러리도 사용해야합니다.

마지막으로 dispatcher.dispatch()을 사용하면 listen()으로 수행 한 DOM 이벤트 등록을 건너 뜁니다. 신호를 사용하고 사용자 정의 이벤트를 수신하는 것을 극복 할 수 있습니다. 그러나 정말로, 순수한 신호를 사용하십시오. 첫 번째 (이상적이지 않은) 접근법을 위해이 피들을 사용해보십시오. http://jsfiddle.net/hfh3z2q4/1/

+0

자세한 정보를 가져 주셔서 감사합니다. 캡슐화/데이터 숨기기를 유지하는 것이 매우 필요하다는 의도가 있습니다. 하지만 어떻게 신호를 사용하거나 DOM 트리 위로 이벤트를 버블 링하여 데이터 캡슐화를 유지하는 데 도움이되는지 잘 모르겠습니다. 더 자세히 설명해 주시겠습니까? –

+1

신호 메커니즘은 구독자가 구독 할 수있는 브로드 캐스트 메시지입니다. 메시지를 버블 링 할 위치를 알 필요가 없으며 구독자에게만 전달되기 때문에 버블 링 메커니즘보다 낫습니다. – Pre101