2016-11-09 57 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