2011-03-23 67 views
0

我们正在研究门户环境。在我们的一个页面上,我们有两个portlet。当某个动作发生在一个portlet上时,我们必须最小化其他portlet,反之亦然。 所以我们觉得这是一个合适的情况,我们可以使用Dojo的发布/订阅模型。但是如果我需要使用不同的主题(一个是在Portlet A上发生某些操作时发生某个操作,另一个是在PortletB上发生某个操作时发生的第二个主题)或一个主题(如最小化),我有点困惑。有人能指导我吗?使用Dojo的发布订阅模型

回答

5

这是真的取决于你,并取决于你的需求。

主题是自由形式的文本,因此您可以使用任何您喜欢的文本格式进行排列。

我自己的经验是将一个主题视为一个“事件”。因此,一个话题,一个事件。

我的经验也认为,在同一个系统中实现“命令”与事件一起实现是非常有益的 - 所以你有一个通用的命令/事件系统。

事件(因此主题)不必与您的portlet相对应。例如,一个portlet可以有多个事件(如果它们有意义),或者一个事件可以被多个portlet共享(用于共享功能或用于跨portlet通信)。

参数和数据可以与事件(即主题)一起作为参数传递。

现在,我学到的一个很好的诀窍是当事物想要订阅特定的事件实例时,有“子主题” - 即带有父主题前缀的主题。

示例:假设我们有一个名为“/ portlets/showhide”的事件,它由任何portlet在显示或隐藏时发布,以及portlet的id和指示它是显示还是隐藏的布尔变量。现在,假设一个portlet在发布时还会发布名为“/ portlets/showhide/{id}”(带有true/false参数)和“/ portlets/showhide/{id}/show”(无参数)的主题与通用的“/ portlets/showhide”主题(事件)一起显示。

现在假设一些处理程序对象实际上只在“xyz”portlet隐藏时才有兴趣。它不必订阅“/ portlets/showhide”,并听取其它不感兴趣的portlet的所有事件。它只需订阅“/ 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 
     } 
}