2016-09-27 49 views
3

在尚未保留到後端的路由模型的上下文中(其ID仍爲null,我們尚未稱爲save),如果我們想要丟棄記錄,使用unloadRecord還是destroy更正確?Ember:unloadRecord與新記錄之間的區別

上下文:用於表單轉換離開但不保存或取消。我是新來的燼,我有點困惑unloadRecord是私有的模型,但不適用於商店。這可能是顯而易見的,但當我們將對象稱爲模型或記錄是正確的時,我也並不積極(我假設它們有時可以互換使用,但如果它們是現有實例,則將它們稱爲記錄在技術上是正確的)。

回答

1

對於這種情況rollbackAttributes方法存在。如果模型尚未保存,它將從商店中刪除。此外,請勿在用戶單擊保存之前創建模型,但是:

  1. 將窗體綁定到控制器的屬性。(我通常使用POJO其中包含所有模型的字段)

  2. 當用戶點擊保存按鈕,驗證數據,建立模型,並調用保存方法

  3. 如果堅持模型後端失敗,rollbackAttributes。如果持久化是成功的,清除控制器屬性(所以當用戶將添加下一個實體時,表單將是乾淨的)並重定向。

Store的unloadRecord卸載堅持從商店記錄(所以你不會有在本地,但可有或沒有它的後端)。

+0

在你看來,爲什麼'rollbackAttributes'比'destroyRecord'更正確? – maffews

+0

@maffews'destroyRecord'的用途是刪除**持久存儲和後端記錄**,而問題是關於新記錄,尚未保留。這就是爲什麼使用它不太正確。您無法保證在未來的版本中它可以正常工作而不會保留記錄。 –

+1

在文檔或代碼註釋中完全支持此功能嗎?我搜索了兩個,我找不到任何說'destroyRecord'只用於保存記錄。基於'destroyRecord'處理未保存記錄的方式以前被視爲[bug](https://github.com/emberjs/data/issues/1593),我認爲'destroyRecord'和'deleteRecord'如果不是比'rollbackAttributes'更適合的話。 – maffews

2

unloadRecord - 是正確的選擇。

Model - destroyRecord - >將調用適配器deleteRecord,這意味着它會將特定記錄的刪除請求提交給服務器。

商店 - unloadRecord - >它只會從商店卸載,它不會提出任何請求到服務器。你只能卸載非髒記錄

模型 - unloadRecord - >它並不是必需的。因爲如果創建了記錄,那麼您將在商店中進入,因此您可以隨時通過商店的unloadRecord方法刪除非髒記錄。

+0

在新創建的記錄上調用destroyRecord確實會導致對save的調用,但Ember可以智能地處理它,並且實際上不會執行遠程請求來將更改持久化到服務器。 – maffews

1

如果您創建但不保存記錄,它將處於root.loaded.created.uncommitted狀態(Ember 2.4)。調用destroyRecord將安排save,但也會立即將狀態更改爲root.deleted.saved,因此save請求將永遠不會執行。

您可以通過在新創建的記錄上檢查通過調用destroyRecord創建的網絡請求,在瀏覽器中驗證此操作。

有一些額外的工作進行圍繞需要destroyRecord時,而不是unloadRecord調度save,所以權衡這裏是調度保存之間永遠不會執行,並確定刪除之前的模型狀態的額外的複雜性記錄。

unloadRecord - 從商店卸載記錄

deleteRecord - 刪除記錄但不保存它(必須調用save

destroyRecord - 電話deleteRecordsave

rollbackAttributes - 回滾屬性或,如果型號isNew,將其從商店中刪除

相關問題