通過GWT RPC更新對象很容易被撤消。我們需要在內存中克隆以前的實體狀態並在撤消時應用它。如何撤消RequestFactory更新
但是,當我們使用RequestFactory沒有具體的更新操作。 RequestFactory將實體修改發送到服務器並更新存儲庫實體本身。我們不能攔截更新過程。
對於使用RequestFactory進行的更新,我應該如何實現撤消操作?
通過GWT RPC更新對象很容易被撤消。我們需要在內存中克隆以前的實體狀態並在撤消時應用它。如何撤消RequestFactory更新
但是,當我們使用RequestFactory沒有具體的更新操作。 RequestFactory將實體修改發送到服務器並更新存儲庫實體本身。我們不能攔截更新過程。
對於使用RequestFactory進行的更新,我應該如何實現撤消操作?
請求工廠不會更新服務器實體,直到您觸發請求。所以你可以簡單地避免調用fire(),以防止修改服務器。希望這是你的意思。你可以發佈代碼,以說明你更新實體的方式,以及你想要執行撤消的地方嗎?
「撤銷」表示服務器上的修改已完成。我需要攔截服務器更新操作以保存實體狀態以供將來撤銷。 –
我不知道你是否想這樣做。爲此,假設你想撤銷一個類的變化,比如說Contact,添加一個相同類型的字段,就像之前的狀態(如果你不想讓它搞砸你的持久性,那就過渡一下),這樣類看起來是這樣的:
class Contact {
Integer id;
Integer version;
String name;
String phoneNumber;
//Transient
Contact previousState;
}
現在在你的堅持服務,備份當前數據到previousState,然後堅持當前的聯繫人實體。在撤消調用從previousState複製數據到「this」。
撤消在服務器上沒有任何意義,這些事情必須在客戶端進行管理。我還沒有遇到任何服務器上需要撤消功能的場景。因此,請引用您希望完成此任務的場景和代碼。
要僅在客戶端執行撤消操作,應該將所有應用程序狀態保留在客戶端上。你認爲這是可能的一個GWT應用程序? –
肯定是的,但你不需要整個應用程序狀態,AddressBook應用程序中的某個實體(如聯繫人實體)就是你想要「撤消」的權利? –
不,你錯了。例如,考慮一個有序的聯繫人列表。 –
你應該考慮修改你的服務器端數據結構和表。在那裏納入時間或雙時模型。不要試圖將「舊」的實體狀態保存在記憶中,或攔截它們。保持實體的先前狀態與時間字段完好無損。撤銷意味着通過時間戳定位先前版本,並使其成爲最新版本。您也可以同時在多個實體類型中執行此操作。
如果你想,你可以定期清理你的數據庫並清理舊版本。暫時寫入的「僅追加」風格也可以產生性能優勢。
您是使用InstanceRequest還是隻是在RF中調用持久性? – Andrejs