2011-03-01 65 views
6

我知道您可以通過簡單地使用JSR286 resourceURL標記並執行AJAX調用來創建可以刷新其內容而無需刷新整個門戶頁面的Portlet。用於inter portlet通信的AJAX可能嗎?

我的問題是,是否有可能在Portlet A中執行AJAX調用,並以某種方式目標並動態更新Portlet B?

這個想法是爲了避免當您通過actionURL或事件進行portlet間的通信時刷新誰的門戶頁面(重新呈現)。

+0

搜索相同...做你找到某種方式? – 2011-09-02 12:30:29

回答

0

如果Portlet B不需要執行服務器端邏輯,那麼您可以簡單地在客戶端上使用pub/sub並讓Portlet B偵聽Portlet A將發佈的特定事件。

所以流程是:

  1. Inital HTML頁面發送到客戶端,用的Portlet和Portlet B於。
  2. 客戶/客戶系統初始化。也許使用類似amplifyjs的東西。
  3. 客戶端上的Portlet B註冊名爲「MyDataUpdated」的主題(或者您希望給出主題的任何有意義的名稱)。
  4. 客戶端通過XHR觸發到Portlet A的serveResource調用。
  5. 服務器上的Portlet A執行serveResource調用的邏輯。
  6. 服務器上的Portlet A將其響應發送回客戶端。
  7. 客戶端上的Portlet A使用serveResource響應並使用主題「MyDataUpdated」發佈結果。
  8. 客戶端上的Portlet B接收到「MyDataUpdated」事件的通知。
  9. 客戶端上的Portlet B可以自行刷新。

以這種方式使用pub/sub將portlet相互分離。如果Portlet A不存在,則Portlet B不會中斷。如果Portlet B不存在,則Portlet A不會中斷。

如果Portlet的C提供沿和是能夠獲取邁德特的,此portlet可以開始發佈「MyDataUpdated」事件和portlet B就開始讓這些事件了。它獲得免費的新更新!

+1

你可以請提供一些教程或技巧資源,如果你有。謝謝 – Scorpion 2012-02-21 03:57:44

1

您可以使用jQuery trigger()和bind()方法在portlet之間進行通信。通過這種方法,所有的通信都將在客戶端(瀏覽器)上進行,而無需任何服務器交互

偵聽事件應該這樣做的門戶B:

$(document).bind("myevent", function(event, param) { 
    // do your work here 
    alert("message recieved with data " + param); 
}); 

是觸發事件應該做以下的門戶答:

$(document).trigger("myevent", "mydata");