1

자바 스크립트에서 모듈 패턴을 사용하고 있습니다. 이벤트를 처리하는 controller.js라는 파일이 있습니다. 문제는 하위 모듈을 사용하고 싶습니다. 그러나 이벤트가 controller.js에서 처리되기 때문에 하위 모듈에서 이벤트가 발생하면 어떻게 처리합니까?
PAGE_DISPLAYED이라는 맞춤 이벤트를 다른 파일 (예 : view.js)에서 발송합니다. 이 이벤트는 controller.js에서 듣고 표시된 페이지에 따라 특정 페이지에 특정한 추가 이벤트 처리기 바인딩과 같은 다른 작업을 수행합니다. 하위 모듈을 사용하여이를 수행하는 방법.모듈 패턴을 사용하여 자바 스크립트에서 이벤트 위임을 확장하는 방법은 무엇입니까?

샘플 코드 :

window.KDJ || (window.KDJ = {}); //namespace 
KDJ.controller = (function() { 
    $(document).off('PAGE_DISPLAYED'); 
    $(document).on('PAGE_DISPLAYED', function (e, data) { 
    switch(data.pageId) { 
    case "page1": 
     // do something.. 
     break; 
    case "page2": 
     // do something.. 
     break; 
    } 
    }); 

    return { 
     // exported methods and props.. 
    }; 
})(); 

가 어떻게 위의 코드와 이벤트 위임을 연장 할 수 있습니까? 또는 코드 아키텍처가 제한을 가하는 경우

내가 jQuery를 모바일을 사용하고 PAGE_DISPLAYED 이벤트가 pagechange 이벤트를 수신하면됩니다 파견하고 있습니다 :

window.KDJ || (window.KDJ = {}); //namespace 
KDJ.view = (function() { 
    // ... 
    $(document).off('pagechange'); 
    $(document).on('pagechange', function (e, ui) { 
     //... 
     $(document).trigger(PAGE_DISPLAYED, {'pageId': loadedPageId, 'key': key}); 
    }); 
})(); 

감사합니다.

+0

이벤트를 파견하려면 어떻게해야합니까? – NicoSantangelo

+0

Nicosunshine : 디스패치 이벤트 코드를 포함하도록 질문을 업데이트했습니다. – boring

+1

좋아, 제 생각 엔 당신이 트리거에 함수를 전달할 수 있다면 주위를 돌아 다닐 수 있다고 생각합니다. 이벤트를 처리하는 방법을 알게 될 것입니다 (바람직하게는 다량의 방식으로). 당신이 원하는 경우 몇 가지 코드를 게시 할 수 :) (지연 미안) – NicoSantangelo

답변

1

좋아, 나는 몇 가지 가능성을 문질러서하지만, 가독성의 측면에서 하나는 내가 가장이 좋아 :

window.KDJ || (window.KDJ = {}); //namespace 
KDJ.controller = (function() { 
    $(document).off('PAGE_DISPLAYED'); 
    $(document).on('PAGE_DISPLAYED', function (e, data) { 

     //Use the Id if it exsits, if not, try to execute the function 
     switch(data.pageId) { 
      case "page1": 
       // do something.. 
       break; 
      case "page2": 
       // do something.. 
       break; 
      default: 
       if(data.customFunction) 
        data.customFunction(); 
       break; 
     } 

    }); 

    return { 
     // exported methods and props.. 
    }; 
})(); 


KDJ.view = (function() { 
    // ... 
    $(document).off('pagechange'); 


    $(document).on('pagechange', function (e, ui) { 

     //the function will be executed 
     $(document).trigger(PAGE_DISPLAYED, { 
      customFunction = function(ui) { 
       console.log("I'm doing something awesome with the ui!"); 
      } 
     }); 

    }); 

    $(document).on('pagechange', function (e, ui) { 

     //here I'll use the switch 
     $(document).trigger(PAGE_DISPLAYED, { 
      'pageId': loadedPageId, 
      'key': key 
     }); 

    }); 
})(); 

Here 기본 않고, 다른 옵션이 있습니다. 귀하의 필요에 맞는 사람이 있는지 알려주십시오.

+0

'컨트롤러'에서 정의되지 않은 경우 data.customFunction()을 사용할 수 있습니다. 함수 정의는 위 조건이 실행되기 전에 나중에로드되는 하위 모듈에 나타납니다. 아니면 하위 모듈에서'PAGE_DISPLAYED' 이벤트를 바인드하고 함수가 존재하는지 확인하고 필요한 작업을 수행 할 수 있습니다. 감사! – boring

관련 문제