뷰 자신이 자신을 지워야 할 때를 감지하려면 어떻게 해야하는가?
상황
현재 user_menu_view 는 딱 한개만 만들어지도록 수정하고 있다.
여기에서 발생하는 문제는 user_menu_view 객체가 자기 자신이 필요없어짐을 감지하고 객체 자체를 지워야하는데 자기 자신이 필요가 없어짐을 어떻게 파악하는지에 대한 아이디어가 떠오르지 않고 있었다는 것.
해결
여기에 IWOO 님이 아주 좋은 아이디어을 생각해주셨는데, 뷰가 아닌 모델과 컬렉션에 이벤트(listenTo)를 걸어두자는 것이었다. 그리고 만약 user_menu_view가 지워져야 할 경우는 걸어 놓은 리스닝에 의해 걸리고 뷰 자기 자신을 지우면 된다 라고 말씀해주셨다.
코드를 기반으로 설명해보자면, 여기에 관련되는 파일과 객체는 아래와 같다.
user.js
의user
모델모델 자체에는 아무런
listenTo
가 걸려있지 않다.
users.js
의users
컬렉션컬렉션 자체에는 아무런
listenTo
가 걸려있지 않다.
뷰에서 모델과 컬렉션에 listenTo를 한다. 해당 이벤트 트리거가 일어난다고 해서 절대로 그 모델과 컬렉션에 함수가 구현되어 있는게 아니다. 이벤트가 트리거되면 해당 뷰에서 작업을 수행한다.
user_unit_view.js
의UserUnitView
뷰this.model
에create_user_menu
라는 이벤트가 걸려있다.create_user_menu 함수를 실행한다.
해당 뷰의 DOM 요소 자체에
click
이벤트가 걸려있다.destroyAndCreateUserMenu 함수를 실행한다.
user_menu_view.js
의UserMenuView
뷰this.parent.online_users
컬렉션에destroy_user_menu_all
이벤트가 걸려있다. 이벤트 트리거의 결과로 close 함수가 실행되고 이 함수는 뷰 자신을 삭제한다.
아래는 실행되는 순서다.
웹 페이지의 user_unit_view 를 마우스로 클릭한다.
해당 DOM 요소에 걸려있던 click event 가 발동한다.
destroyAndCreateUserMenu 가 발동한다. 해당 함수는 컬렉션과 모델 각각의 이벤트를 트리거 해주는 역할만한다.
컬렉션의
destroy_user_menu_all
이벤트를trigger
한다. 이 함수가 실행되면user_menu_view
에 있는close
함수가 실행되면서 기존 메뉴뷰가 삭제된다.이후 모델의
create_user_menu
를trigger
한다. 그러면 이제 해당 모델의 정보를 이용해서user_menu_view
를 만든다.
Last updated