2011-03-23 2 views
0

우리는 포털 환경에서 작업하고 있습니다. 우리 페이지 중 하나에는 두 개의 포틀릿이 있습니다. 하나의 포틀릿에서 어떤 동작이 발생하면 다른 포틀릿과 그 반대를 최소화해야합니다. Dojo의 publish/subscribe 모델을 사용할 수있는 적절한 상황이라고 생각합니다. 그러나 다른 주제를 사용해야하는 경우 조금 혼란 스럽습니다. [포틀릿 A에서 일부 작업이 발생하는 경우, 두 번째 항목에서 PortletB에서 일부 작업이 발생하는 경우] 또는 하나의 항목 [최소화와 같은 항목]을 사용해야합니다. 누군가 나를 인도 해 주실 수 있습니까?Dojo의 Publish Subscribe 모델 사용

답변

5

이것은 실제로 당신에게 달려 있으며 필요에 따라 다릅니다.

주제는 자유형 텍스트이므로 원하는 텍스트 형식으로 정렬 할 수 있습니다.

내 경험으로 주제가 "이벤트"로 취급되었습니다. 따라서 하나의 주제, 하나의 이벤트.

제 경험으로는 이벤트와 동일한 시스템에서 "명령"을 구현하는 것이 매우 효과적이기 때문에 범용 명령/이벤트 시스템이 있습니다.

이벤트 (따라서 항목)가 포틀릿과 일치 할 필요는 없습니다. 예를 들어, 하나의 포틀릿은 여러 이벤트를 가질 수 있습니다 (합리적인 경우) 또는 하나의 이벤트를 여러 포틀릿에서 공유 할 수 있습니다 (공유 기능 또는 포틀릿 간 통신의 경우).

매개 변수와 데이터는 인수 (예 : topic)와 함께 전달 될 수 있습니다.

내가 배운 좋은 트릭은 특정 주제의 이벤트를 구독하려는 경우 부모 주제로 접두사가 붙은 주제 인 '하위 주제'를 갖는 것입니다.

예 : 포틀릿의 ID 및 표시 여부를 나타내는 부울 변수와 함께 표시되거나 숨겨진 포틀릿에 의해 게시되는 "/ portlets/showhide"이벤트가 있다고 가정합니다.

이제는 포틀릿에서 "/ portlets/showhide/{id}"(참/거짓 인수 포함) 및 "/ portlets/showhide/{id}/show"(인수 없음) 일반 "/ portlets/showhide"주제 (이벤트)와 함께 표시됩니다.

이제 "xyz"포틀릿이 숨겨져있을 때 일부 처리기 객체에만 관심이 있다고 가정합니다. "/ portlets/showhide"를 구독 할 필요가 없으며 관심이없는 다른 포틀릿의 모든 이벤트를 청취 할 수 있습니다. 단순히 "/ portlets/showhide/xyz/hide"를 구독 할 수 있습니다. 대형 시스템에서 구독 수가 증가하면 이러한 종류의 최적화가 매우 편리해질 수 있습니다.

2

추가 매개 변수를 전달하는 항목 하나를 사용할 수 있습니다. 다음과 같은 내용 :

// PortletA 
dojo.publish("onPortletAction", [{sender: "PortletA"}]); 

// PortletB 
dojo.publish("onPortletAction", [{sender: "PortletB"}]); 
.... 

dojo.subscribe("onPortletAction", dojo.hitch(window, window.processAction)); 

window.processAction = function(data) { 
    if (data.sender == "PortletA"){ 
      //to do something 
     } 
     if (data.sender == "PortletB") { 
      //to do something 
     } 
}