Liferay IPC 监听器运行多次

Posted

技术标签:

【中文标题】Liferay IPC 监听器运行多次【英文标题】:Liferay IPC listener runs multiple times 【发布时间】:2017-03-23 00:10:11 【问题描述】:

首先很抱歉,如果这个问题已经在某个地方提出过,但是在谷歌上几个小时后我仍然找不到答案。

我是 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' 的类别,那么该函数将运行 3 次 'id=1'。现在,如果我选择 'id=2',它将在 'id=2' 下运行 3 次。

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

非常感谢您,如果您需要任何进一步的信息,请告诉我。

【问题讨论】:

您可能想要添加您正在使用的(确切的)Liferay 版本 当然,抱歉...我们使用 7.x (7.0.2)。 【参考方案1】:

您遇到的问题是由正在创建但从未删除的全局 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);

【讨论】:

正是我需要的!我已经发现问题必须是这样的,但我认为它有某种缓存或其他东西并且找不到解决方案,因为我显然走错了方向。无论如何,它现在完美无缺。感谢您的快速回复! 我很高兴它帮助了@CsanádVereckei!请接受有效的答案,以帮助其他人快速识别问题和解决方案:)

以上是关于Liferay IPC 监听器运行多次的主要内容,如果未能解决你的问题,请参考以下文章

Liferay7 BPM门户开发之4: Activiti事件处理和监听Event handlers

Electron Renderer 进程:我啥时候应该清理 IPC 监听器

如何同时监听 D-Bus 事件和 IPC 通道?

为啥 jQuery 选择事件侦听器会触发多次?

在 Liferay 中集成 ActiveMQ 的 Spring 问题

Firebase实时数据库单值监听器多次触发