2012-01-20 66 views
10

通過GWT RPC更新對象很容易被撤消。我們需要在內存中克隆以前的實體狀態並在撤消時應用它。如何撤消RequestFactory更新

但是,當我們使用RequestFactory沒有具體的更新操作。 RequestFactory將實體修改發送到服務器並更新存儲庫實體本身。我們不能攔截更新過程。

對於使用RequestFactory進行的更新,我應該如何實現撤消操作?

+0

您是使用InstanceRequest還是隻是在RF中調用持久性? – Andrejs

回答

0

請求工廠不會更新服務器實體,直到您觸發請求。所以你可以簡單地避免調用fire(),以防止修改服務器。希望這是你的意思。你可以發佈代碼,以說明你更新實體的方式,以及你想要執行撤消的地方嗎?

+0

「撤銷」表示服務器上的修改已完成。我需要攔截服務器更新操作以保存實體狀態以供將來撤銷。 –

0

我不知道你是否想這樣做。爲此,假設你想撤銷一個類的變化,比如說Contact,添加一個相同類型的字段,就像之前的狀態(如果你不想讓它搞砸你的持久性,那就過渡一下),這樣類看起來是這樣的:

class Contact { 

    Integer id; 
    Integer version; 

    String name; 
    String phoneNumber; 

    //Transient 
    Contact previousState; 

} 

現在在你的堅持服務,備份當前數據到previousState,然後堅持當前的聯繫人實體。在撤消調用從previousState複製數據到「this」。

撤消在服務器上沒有任何意義,這些事情必須在客戶端進行管理。我還沒有遇到任何服務器上需要撤消功能的場景。因此,請引用您希望完成此任務的場景和代碼。

+0

要僅在客戶端執行撤消操作,應該將所有應用程序狀態保留在客戶端上。你認爲這是可能的一個GWT應用程序? –

+0

肯定是的,但你不需要整個應用程序狀態,AddressBook應用程序中的某個實體(如聯繫人實體)就是你想要「撤消」的權利? –

+0

不,你錯了。例如,考慮一個有序的聯繫人列表。 –

1

你應該考慮修改你的服務器端數據結構和表。在那裏納入時間或雙時模型。不要試圖將「舊」的實體狀態保存在記憶中,或攔截它們。保持實體的先前狀態與時間字段完好無損。撤銷意味着通過時間戳定位先前版本,並使其成爲最新版本。您也可以同時在多個實體類型中執行此操作。

  • 01:00比薩餅保存的
  • 01:01比薩配料改變
  • 01:02比薩配料改變
  • 01:03撤消01:01

如果你想,你可以定期清理你的數據庫並清理舊版本。暫時寫入的「僅追加」風格也可以產生性能優勢。