2016-11-09 8 views
2

Прежде всего извините, если этот вопрос уже задан где-то, но через несколько часов в Google я до сих пор не могу найти ответ.Liferay IPC прослушиватель работает несколько раз

Я довольно новичок в разработке портлетов (но у нас нехватка разработчиков, и я должен работать с ним время от времени), поэтому решение может быть чем-то тривиальным, но мне действительно не хватает опыта с Это.

Проблема: у меня есть два портлета на странице, и я стараюсь, чтобы один из них знал об изменениях в другом. Для этого я использую 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», он будет работать 3 раза с «id = 2».

Если у кого-то есть идеи, я был бы очень благодарен, поскольку я застрял почти целый день.

Благодарим вас заблаговременно и, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

+0

вы можете добавить (точную) Liferay версию, что вы работаете с –

+0

Конечно, извините ... Мы используем 7.x (7.0.2). –

ответ

3

проблема, с которой вы сталкиваетесь, вызвана глобальными 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); 
+0

То, что мне нужно! Я понял, что проблема должна быть чем-то вроде этого, но я подумал, что у нее есть какой-то кеш или что-то еще, и я не мог найти решение, потому что я явно двигался в неправильном направлении. В любом случае он отлично работает сейчас. Спасибо за быстрый ответ!! –

+2

Я рад, что это помогло @ CsanádVereckei! Пожалуйста, примите ответ как действительный, чтобы помочь другим быстро определить проблему и решение :) – jbalsas