使用Dojo的发布订阅模型

时间:2011-03-23 10:11:04

标签: dojo

我们正在开发门户环境。在我们的一个页面上,我们有两个portlet。当在一个portlet上发生某些操作时,我们必须最小化其他portlet,反之亦然。 因此我们认为这是一个适合我们可以使用Dojo的发布/订阅模型的情况。但是我有点困惑,如果我需要使用不同的主题[一个在Portlet A上发生某些动作时,第二个主题是在PortletB上发生某些动作时]或一个主题[类似于最小化]。有人可以指导我。

2 个答案:

答案 0 :(得分:5)

这取决于你,取决于你的需求。

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

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

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

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

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

现在,我学到的一个好方法就是拥有“子主题” - 即在事物想要订阅特定事件实例时以父主题为前缀的主题。

示例:假设我们有一个名为“/ portlets / showhide”的事件,它在显示或隐藏时由任何portlet发布,同时还有portlet的id和一个布尔变量,指示它是显示还是隐藏。 / p>

现在,假设portlet还会在显示时发布名为“/ portlets / showhide / {id}”(带有true / false参数)和“/ portlets / showhide / {id} / show”(无参数)的主题,以及通用的“/ portlets / showhide”主题(事件)。

现在假设某个处理程序对象真的只对隐藏“xyz”portlet感兴趣。它不必订阅“/ portlets / showhide”并监听它不感兴趣的其他portlet的所有事件。它可以简单地订阅“/ portlets / showhide / xyz / hide”。当大型系统中的订阅数量增加时,这种优化可以非常方便。

答案 1 :(得分: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
        }
}