2016-11-09 59 views
2

首先感到抱歉,如果这个问题已经在某个地方问过了,但在谷歌上几个小时后我仍然无法找到答案。Liferay IPC监听器多次运行

我在portlet开发方面很新颖(但是我们缺乏开发人员,所以我不得不随时使用它),所以解决方案可能是微不足道的,但我真的没有足够的经验它。

的问题是我有一个页面上的两个portlet和我设法让他们一知道在其他的变化。为此,我使用IPC。在第一个我有一个Liferay.fire功能:

function fire(key,value){ 
    Liferay.fire(
     'category',{ 
      id: key, 
      name: value 
     } 
    ); 
} 

在另外我有一个Liferay.on('category',function(category){...})函数里面调用Ajax和一些渲染方法。

现在,如果我访问所提及的页面并单击相应的按钮,首先一切正常。但是,如果我从此页面导航并返回,则侦听器将运行两次。再次导航 - >三次。等等......但如果我重新加载页面(使用F5或CTRL + F5),它会重新开始,所以直到进一步导航时,侦听器才会运行一次。

另一个奇怪的是无论多少次的函数运行,输入参数是每个都一样。

例如,如果我已经离开了页面,又回到它3次,也是最后一次,我选择了与类别“ID = 1”,则该函数将与“ID = 1”运行3次。现在,如果我选择'id = 2',它将以'id = 2'运行3次。

如果有人有任何想法,我会非常感激,因为我被困在将近一天了。

非常感谢您提前,并请让我知道如果您需要任何进一步的信息。

+0

你可能想补充一点,你与 –

+0

工作(精确)Liferay的版本当然,对不起...我们使用7.x(7.0.2)。 –

回答

3

您遇到的问题是由正在创建但永远不会被删除的全球Liferay.on听众造成的。

在Liferay Portal 7.x中,默认情况下会启用SPA导航。这意味着当你浏览时,页面并没有被完全刷新,而是简单地用来自服务器的新数据进行更新。

在传统的导航的情况下,每一页刷新重置的一切,这样你就不必如此谨慎剩下的背后的一切。但是,在SPA情景中,全球听众(如Liferay.onLiferay.after)或身体代表可能会出现问题。每次执行该代码时,都会向全局持久对象Liferay添加另一个侦听器。结果是观察到这些监听器的多个调用。

要解决它,你只需要听的导航事件,以脱离你的听众是这样的:

var onCategory = function(event) {...}; 

var clearPortletHandlers = function(event) { 
    if (event.portletId === '<%= portletDisplay.getRootPortletId() %>') { 
     Liferay.detach('onCategoryHandler', onCategory); 
     Liferay.detach('destroyPortlet', clearPortletHandlers); 
    } 
}; 


Liferay.on('category', onCategory); 
Liferay.on('destroyPortlet', clearPortletHandlers); 
+0

正是我需要的!我已经发现问题必须是这样的,但我认为它有某种缓存或某种东西,并且找不到解决方案,因为我明显向错误的方向发展。 无论如何,它现在完美。谢谢你的快速反应!! –

+2

我很高兴它帮助@CsanádVereckei!请接受答案,以便帮助他人快速找出问题和解决方案:) – jbalsas