2016-09-12 20 views
0

그래서 나는 구성 요소를 가지고 있고, 나는 상태 변경, 예를 들어, 트리거해야 그것은이 클릭 할 때의 말을하자 : 나는 그것을 "비활성화"무엇을하려는 경우, 지금글로벌 이벤트 및 구성 요소의 로컬 상태

:on-click #(om/set-state! this {:activated? true}) 

을 문서의 아무 곳이나 클릭하면? 난 그냥은 document 객체에 이런 일을 접선으로 addEventListener을 사용할 수있는 것 같아요 :

(componentDidMount [this] 
     (events/listen (gdom/getDocument) 
     (.-CLICK events/EventType) 
     #(om/set-state! this {:activated? false}) true)) 

지금이 내가 원하는 것을, 그러나 나는 것 같은 구성 요소의 200 개 인스턴스가 처음으로 모든 경우 200 이벤트 리스너, 맞죠? 바람직하지는 않지만 괜찮은 것 같아요.

실제 상태는 설정 상태를 구성 할 때 구성 요소의 인스턴스를 다른 인스턴스와 어떻게 구별합니까? 나는 분명히 그것들 모두가 "비활성화"되어지는 것을 원하지 않는다. 단지 클릭 이벤트 처리기가 작동되는 컨텍스트가있는 것만을 사용한다.

+0

N 개의 DOM 노드마다 N 개의 이벤트 리스너를 가질 수 있으며 각 노드에는 고유 한 이벤트 리스너가 있고 전자는 괜찮습니다. 상태의 특정 속성 (아마': activated')을 검사 할 수 있고, 특정 값이 있으면 아무 것도하지 말고, 그렇지 않으면 무언가를하고, 청자도 클릭마다 실행됩니다. (그것도 완벽하게 괜찮습니다.) 정말 중요한 질문에 답하는 것은 도움이되지 않지만, 여전히 유용합니다. –

답변

1

나는이 문제의 제목이 실제 문제를 지적한다고 생각한다. 상태. "활성화 된"이라는 개념이 이러한 각 구성 요소 (로컬 상태)에 속하지 않고 트리의 더 높은 부분에 속하는 것처럼 들립니다. 그렇지 않으면, 그들은 독립적으로 기능 할 것입니다. 하지만 한 번에 이들 중 하나가 활성화되기를 바랍니다. 맞습니까?

나는 현재 활성 상태 인 것을 부모의 로컬 상태 또는 글로벌 앱 상태로 식별 할 수 있습니다. 그런 다음 부모가 각 어린이에게 클릭하여 활성화 할 때 콜백 할 수있는 콜백을 제공합니다. 마지막으로, 부모는 요소에 단일 클릭 이벤트 리스너를 가질 수 있습니다. 전체 페이지를 포함하는 요소는 활성 자식을 비활성화합니다 (활성 자식을 저장할 때마다 nil으로 설정).

+0

전역 이벤트를 로컬 상태와 섞지 않는다는 의미를 이해합니다. 그러나이 경우에는 문제의 전문성 (즉, 처리기가 트리거되는 구성 요소의 구별되는 문맥)에 대해 궁금합니다. '듣기'는 문맥을 매개 변수로 사용합니다. http://www.closurecheatsheet.com/events#listen, 아마도 'this-as' 매크로를 사용하고 글로벌 이벤트를 유발 한 정확한 구성 요소를 찾는 방법이 있을까요? – Agzam

+0

만약 정말로 * 이것을하고 싶다면, 당신의'on-click' 핸들러에서'events/listen'을 할 수 있고, 발생 후 리스닝을 분리 할 수 ​​있습니다. 하지만 여전히 구조적인 문제가 여기에 있다고 생각합니다. 아마 그 문제를 해결하고 반복적으로 해결할 것입니다. – Peeja

+0

예 저는 이벤트 리스너를 분리하거나 연결하는 것을 좋아하지 않습니다. 또한 클릭 이벤트를 잡기 위해 전체 페이지를 덮는 불투명 한 요소가있는 경우 느낌이 옳지 않다면 두 번 클릭해야합니다 (다른 부작용의 경우) – Agzam

관련 문제