2013-04-20 9 views
6

다음 다트 코드를 작성하면 어떤 클릭 핸들러가 먼저 발생하는지 어떻게 알 수 있습니까?다트 (Dart)에서 두 명의 청취자가있는 클릭 이벤트를 듣는 경우 어떤 이벤트가 먼저 발생하는지 어떻게 알 수 있습니까?

main() { 
    var button = new ButtonElement(); 
    var stream = button.onClick.asBroadcastStream(); 

    stream.listen(clickHandler1); 
    stream.listen(clickHandler2); 
} 

처음 두 클릭 핸들러에 대해 알지 못하는 다른 코드이지만 다른 것을 등록합니다.

  • 스트림에 두 개의 수신기가 있다는 것을 알 수 있습니까?
  • 다른 모든 가입자를 일시 중지하거나 취소 할 수 있습니까?
  • 다른 곳에서 button.onClick.asBroadcastStream()을 다시 쓰면 main에서 사용 된 것과 같은 스트림을 가리 킵니까?
  • 핸들러 중 하나에서 다른 브로드 캐스트 리스너에게 이벤트를 전달하지 않는다고 말할 수 있습니까? 그것은 소비자입니까?

답변

6

것은 이제 내가 처음 이 클릭 핸들러에 대해 아무것도 모르는 다른 코드에있어 가정 해 봅시다,하지만 난 다른 하나를 등록합니다.

스트림에 두 개의 수신기가 있다는 것을 알 수 있습니까?

아니요. 청취자가 다른 청취자에 대해 알아야한다고 생각하지 않기 때문에 스트림 클래스를 확장하거나 랩핑하여이 기능을 직접 제공 할 수는 있지만 좋은 디자인 선택의 여지가 없습니다. 정확히 무엇을하려는 거니? 아마도 청중들에게 서로에 대해 알리는 것보다 더 좋은 방법이있을 것입니다.

다른 모든 가입자를 일시 중지하거나 취소 할 수 있습니까?

cancel/pause/resume 당신은 상대방 만 취급 할 수 있습니다. 다시 말하지만, 다른 리스너를 건드리지 않아야합니다.하지만 Stream 클래스를 래핑하거나 확장하여 이러한 동작을 수행 할 수 있다고 생각합니다.

다른 곳에서 button.onClick.asBroadcastStream()을 다시 작성하면 main에서 사용 된 것과 같은 스트림을 가리 킵니까?

아니요, 적어도 SDK의 현재 버전은 아닙니다. 따라서 불행하게도이 방송 스트림에 대한 참조를 어딘가에 저장하고 참조해야합니다. asBroadcastStream() 번을 여러 번 호출하면 예상 한 결과가 나오지 않으므로 참조해야합니다. (참고 : 적어도 빠른 테스트를 기반으로 : http://d.pr/i/Ip0Kdocumentation이 다른 것으로 보이는 것 같지만 시간을 찾으면 아직 테스트하지 않은 상태입니다.)

처리기 중 하나에서 다른 브로드 캐스트 수신기에 이벤트를 전달할 수 없다고 말할 수 있습니까?

글쎄, 여기에는 HTML 랜드에 stopPropagation()이 있습니다. 즉, 이벤트가 다른 요소로 전파되지는 않지만 아마도 사용자가 찾고 있었던 것이 아닙니다.

다른 리스너에서 이벤트 발생을 중지하려면 리스너가 호출되는 순서가 있어야합니다. 나는 그 순서가 그 청자들의 등록 순서라고 믿는다.디자인 관점에서 볼 때 청취자가 다른 사용자를 취소/일시 중지 할 수있는 것은 좋지 않을 것이라고 생각합니다.

HTML의 이벤트 전파는 그것이 계층 구조에 관한 것이기 때문에 의미가 있습니다.하지만 여기서는 HTML의 이벤트가있는 경우에도 단일 요소에 대해 여러 개의 수신기가있을 수 있습니다.

수신자에게 가중치를 할당하거나 중요도 순서를 정의 할 방법이 없으므로 이벤트를 중지 할 수있는 방법이 없다는 것은 놀라운 일이 아닙니다.

청중에게 서로에 대해 알리고 서로 조작하게하는 대신 어쩌면 다른 방법으로 문제에 접근하려고 생각해보십시오.

소비자입니까?

StreamConsumer은 다른 스트림을 클래스에 파이프 할 수있게하려는 경우 구현할 수있는 클래스입니다.

+0

당신은'asBroadcastStream()'에 대해 틀렸어. –

+0

음, 틀렸을 수도있다.이 코드는 http://d.pr/i/Ip0K 그러나 첫 번째'false' 다음에'true'를 출력한다. 그래서 그들은 다른 대상을 가리 킵니다. 시간을 찾으면 자세히 조사 할 수 있습니다. 코드베이스도 변경 될 수 있으며 답변에 연결된 항목이 예를 들어와 다릅니다. SDK의 스트림 구현 :) –

+0

코드가 두 개의 브로드 캐스트 스트림을 만듭니다. 생성 한 첫 번째 브로드 캐스트 스트림에서 asBroadcastStream()을 호출하면 동일한 결과를 얻습니다. 그것은 무엇이 요구되는지입니다. 스트림 구현은 브로드 캐스트 스트림 인 경우이를 반환합니다. 질문에 사용 된 스트림을 언급했습니다. –

1

스트림에 두 개의 수신기가 있다는 것을 알 수 있습니까?

아니요, DOM 이벤트 처리를 래핑하는 '스트림'이 있습니다. 그러한 기능은 없습니다.

다른 모든 가입자를 일시 중지하거나 취소 할 수 있습니까? Event.stopPropagation()Event.stopImmediatePropagation(), 그리고 아마도 Event.preventDefault()에서

봐.

다른 곳에서 button.onClick.asBroadcastStream()을 다시 작성하면 main에서 사용 된 것과 같은 스트림을 가리 킵니까? onClick 게터 새로운 스트림가 호출 될 때마다 반환 이후

은 [업데이트] 아니, current implementation 다시 당신에게 동일한 스트림을 제공하지 않습니다. 그러나 반환 된 스트림은 이미 브로드 캐스트 스트림이므로 asBroadcastStream()을 호출하면 안됩니다. 당신이 그렇게한다면, 같은 물체에 대한 참조를 얻을 수 있습니다.

Stream<T> asBroadcastStream() => this; 

나는 다른 브로드 캐스트 리스너에 이벤트를 전달하지 않도록 처리기 중 하나를 말할 수 있습니까? 그것은 소비자입니까?

다시 Event.stopPropagation()Event.stopImmediatePropagation(), 그리고 아마도 Event.preventDefault()를보십시오.

+0

'Event.stopPropagation()'** **는 다른 리스너가 호출되는 것을 막지 않습니다 (http://d.pr/i/4ZFx- 두 번 인쇄). 그것은 전달을 멈추게 할 뿐이며, 계층 구조로 인해 순전히 DOM 일 수도 있습니다. 스트림은 DOM뿐만 아니라 다양한 용도로 사용된다는 점을 기억하십시오. :) –

+0

당신이 맞습니다. 즉각적인 버전입니다.하지만 콜백은 멈추고 순서는 보장되지 않습니다. 물론 많은 것들에 대해 확실한 스트림이 사용되지만 질문은 DOM에 관한 것입니다. –

+0

DOM 핸들러가 이미 브로드 캐스트 스트림이므로 asBroadcastStream()을 호출 할 필요가 없다고 추가해야합니다. –