2016-07-23 48 views
0

我想進行交叉表通訊。在這一點上,我想使用localStorage/sessionStorage。Gwt localStorageEvent - 交叉表通訊

的Class1包含這部分代碼:

Storage stockStore = Storage.getLocalStorageIfSupported(); 
if (stockStore != null) { 
    stockStore.setItem("newLoad", "123"); 
} 

Class2中包含的這部分代碼:

Storage stockStore = Storage.getLocalStorageIfSupported(); 
    if (stockStore != null) { 
      stockStore.addStorageEventHandler(new StorageEvent.Handler() { 
      public void onStorageChange(StorageEvent event) { 
      Log.println("Heureka!"); 
      } 
     }); 
    } 
在一類

代碼被調用時用戶按鈕。

所以,當用戶打開兩個標籤,他按下(在選項卡1內)將調用class1中的代碼。然後觸發事件並寫入「Herueka」,但僅在其實際選項卡(選項卡1)中。 它應該寫在兩個選項卡(選項卡1和選項卡2)中。所以這不起作用。

標籤1的地址:http://127.0.0.1:8888/#loads

標籤2的URL:http://127.0.0.1:8888/index.html#lights

標籤具有相同的會話,並使用我FF 47,用於檢測正在。 一切都編譯通過eclipse本地碼頭服務器和超級開發模式使用。

回答

0

我可以證實這一點,並試圖利用本地存儲上的事件時遇到同樣的問題。 不幸的是,存儲事件似乎並沒有跨越標籤。 至少我無法讓他們可靠地觸發所有標籤,我還需要從事件中排除當前標籤(該標籤解僱了它,並且不需要通知)。

我做的一個解決方法是創建一個類,它使用本地存儲來處理信號。 這是相當多的代碼,這是綁定到一個內部項目,但我會嘗試概述它是如何完成的,以幫助您入門。

我不依賴於此處的事件,但使用TimerscheduleRepeating來每隔3秒定期檢查本地存儲。

每個選項卡都需要一個不同的ID,您可以生成不同的ID,例如,使用Random。 如果我想發信號給我在當地storage設置一個條目。 此條目的關鍵是信號名稱,值是設置信號的選項卡的ID。

因此,當執行Timer時,我檢查信號名稱的條目。如果我找到一個,我檢查值是不同於當前選項卡的id,因爲我不想通知信號選項卡它自己的事件。

您只需要記住在關閉應用程序或經過一段合理的時間後從本地存儲中刪除條目。否則,您可能會在應用程序重新啓動時遇到舊條目,並再次執行信號處理程序。

畢竟它不是完美的,因爲總是每3秒運行一次Timer,信號標籤也可能需要3秒鐘才能接收信號。然而,這是我獲得不同製表符之間可靠信號的唯一途徑。因爲以前的答案

+0

謝謝你的回答。我將實施此解決方法,但請保持問題處於打開狀態,因爲這不是針對此問題的100%解決方案。 – Delirante

1

一種解決方法已經發現:https://github.com/gwtproject/gwt/issues/9205(我還沒有嘗試過)

這麼說,我已經證實了以下工作:

private static native void addTrueStorageHandler(Handler h) /*-{ 
    $wnd.addEventListener('storage', function(e) { 
     [email protected]::onStorageChange(Lco m/google/gwt/storage/client/StorageEvent;)(e); 
    }); 
}-*/; 

上述功能應該被調用來註冊Handler。這只是創建一個JavaScript匿名函數來調用處理程序。它完全繞過了整個GWT機制。