Liferay IPC 侦听器运行多次
Liferay IPC listener runs multiple times
首先很抱歉,如果这个问题已经在某个地方被问过,但几个小时后 google 我仍然找不到答案。
我是 portlet 开发的新手,(但我们缺乏开发人员,我不得不时不时地使用它),所以解决方案可能是微不足道的,但我真的没有足够的经验有了它。
问题是我在一个页面上有两个 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),它会重新开始,因此在进一步导航之前,侦听器 运行s 只有一次。
另外一个奇怪的事情就是无论运行s函数执行多少次,每次输入的参数都是一样的。
例如,如果我已经离开该页面并返回该页面 3 次,而上次我选择了带有 'id=1' 的类别,那么该函数将 运行 3 次带有 [=30] =].现在,如果我选择 'id=2',它将 运行 3 次 'id=2'。
如果有人有任何想法,我将非常感激,因为我现在被困了将近一天。
非常感谢您,如果您需要任何进一步的信息,请告诉我。
您遇到的问题是由正在创建但从未删除的全局 Liferay.on
侦听器引起的。
在 Liferay Portal 7.x 中,SPA 导航是默认启用的。这意味着当您导航时,页面不会完全刷新,而只是使用来自服务器的新数据进行更新。
在传统的导航方案中,每次页面刷新都会重置所有内容,因此您不必对遗留的所有内容如此小心。然而,在 SPA 场景中,Liferay.on
或 Liferay.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);
首先很抱歉,如果这个问题已经在某个地方被问过,但几个小时后 google 我仍然找不到答案。
我是 portlet 开发的新手,(但我们缺乏开发人员,我不得不时不时地使用它),所以解决方案可能是微不足道的,但我真的没有足够的经验有了它。
问题是我在一个页面上有两个 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),它会重新开始,因此在进一步导航之前,侦听器 运行s 只有一次。
另外一个奇怪的事情就是无论运行s函数执行多少次,每次输入的参数都是一样的。
例如,如果我已经离开该页面并返回该页面 3 次,而上次我选择了带有 'id=1' 的类别,那么该函数将 运行 3 次带有 [=30] =].现在,如果我选择 'id=2',它将 运行 3 次 'id=2'。
如果有人有任何想法,我将非常感激,因为我现在被困了将近一天。
非常感谢您,如果您需要任何进一步的信息,请告诉我。
您遇到的问题是由正在创建但从未删除的全局 Liferay.on
侦听器引起的。
在 Liferay Portal 7.x 中,SPA 导航是默认启用的。这意味着当您导航时,页面不会完全刷新,而只是使用来自服务器的新数据进行更新。
在传统的导航方案中,每次页面刷新都会重置所有内容,因此您不必对遗留的所有内容如此小心。然而,在 SPA 场景中,Liferay.on
或 Liferay.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);