2013-02-07 50 views
19

我很努力去理解將在以下場景中使用的工作流程:當處於錯誤狀態時,您可以使用Ember Data Models做什麼?

用戶創建一個模型,我們稱之爲Product。我們給他們提供一個表單來填寫。保存錯誤除了驗證之外的其他原因(超時,拒絕訪問等等)。在Ember中,這會使模型進入錯誤狀態。從UI的角度來看,我想要做的就是在屏幕上放置一條消息(簡單),並允許用戶再次嘗試(顯然不是那麼容易)。

我已經看到它寫了很多次不重用一個事務。我明白這一點的邏輯。對於新產品,我簡單地創建另一個新產品,合併來自原始產品(屬性,關係)的數據,並用新產品替換我的控制器的內容。這並不困難,似乎很好地工作,雖然可能(有希望)更好的方式。

但是,當我編輯產品時,我遇到了一個嚴重問題,上述解決方案無法正常工作。產品模型現在處於錯誤狀態,我無法找到任何方式獲取不同於此產品的副本,該副本不處於相同狀態。

我弄不清楚是什麼,我可以做這個模型,一旦它達到錯誤狀態。我嘗試了以下方法:

回滾:這不起作用。您無法在錯誤狀態下回滾事務。

重新加載:同上。不允許在錯誤狀態下重新加載記錄。

抓取記錄的新副本:所以我嘗試使用與現有記錄相同的ID的App.Product.find(id)。它只是給我一個現有記錄的副本,處於錯誤狀態。

我希望我在這裏錯過了一些相當基本的東西。是否有可能將錯誤狀態(或無效狀態)記錄在一個錯誤狀態?

如果有一種簡單的方法來改變這些模型的狀態,我們是否應該爲進一步的提交嘗試創建一個新的事務?

+0

看看這個線程和這種模式。 http://stackoverflow.com/a/16471974/1330615 – danielgatis

+0

看看這個線程和這種模式。 http://stackoverflow.com/a/16471974/1330615 – danielgatis

+1

@danielgatis我看看你的要點,這是與從您發佈的鏈接... 我看到爲什麼你的工作模式爲新的記錄,因爲你只是摧毀失敗,並創建一個新的,當它不驗證。這不會導致您丟失用戶輸入的數據嗎?這也不適用於編輯現有記錄。 最後是否需要在這個問題上發表您的評論三次? –

回答

13

因此,經過幾天的閱讀和實驗,我得出結論,這是尚未實現的功能。要將記錄移動到另一個狀態,您應該將事件發送給它,並通過它傳遞給statemanager。在錯誤狀態中似乎沒有註冊事件,允許我們恢復記錄。

有一個醜陋的解決方法 - 我可以在記錄的statemanager上撥打transitionTo並強制它進入我們想要的狀態。我並沒有決定輕易做到這一點,但是在這一點上,我必須繼續進行該項目,同時等待燼數據的發展。因此,如果記錄至今未保存的,我們可以從一個無效或錯誤狀態通過調用挽救:

model.get('stateManager').transitionTo('loaded.created.uncommitted')

或現有的記錄:

model.get('stateManager').transitionTo('loaded.updated')

一旦這已經稱爲,您可以嘗試再次調用模型所在的事務的提交。這將是默認事務,因爲一旦在其原始事務上調用了提交,ember-data的行爲就是將模型移動到默認事務中。通過調用model.get('transaction')

您可以隨時檢索當前的模型事務。所以最後,我有一種方法來創建我們可能在Ruby on Rails中看到的典型CRUD場景,但我不相信這個是做這件事的理想方式。不過,我確實相信在這個時候,燼數據團隊也不會。

對於那些對Ember擁有CRUD功能作爲控制器和路由混合的用戶,我有一個Gist,其中包含我當前使用的代碼。這工作正常,從保存錯誤以及驗證錯誤中恢復。希望我可以繼續改進這個隨着數據發展的燼數據。

+1

感謝您的代碼。然而,當我使用你的代碼時,我似乎有一個競爭條件;它會在'lifecyclecallback'事件發送之前強制狀態,並且當它發生時,它會處於未處理狀態(加載狀態不處理該事件)。當事件沒有被處理時,最近版本的呃err。 – bouke

+0

嗨!看看這個線程和這種模式。 http://stackoverflow.com/a/16471974/1330615 – danielgatis

0

大衛,

你可以嘗試創建模型的並行表現爲不保留,但具有相同的屬性,你的持久性模型的Ember.Object。如果您的ajax在錯誤狀態下彈回,您可以使用ajax方法提供的錯誤回調來執行某些操作。

在這種情況下,「某事」可能是刪除記錄,然後將虛擬對象中的屬性複製到新記錄中並重新保存該記錄。在成功回調中,簡單地銷燬臨時對象,並且如果所有記錄都是乾淨的,則清除臨時對象(以防止臨時對象存在)。

這也可能是瘋了......但它罷工我作爲一種選擇。

史蒂夫

+1

您好史蒂夫, 我很感謝您嘗試回答這個問題,不幸的是,解決方案並不現實。即使我確實遇到了創建並行對象的麻煩,但Ember模型仍處於錯誤狀態的事實阻止了我刪除它。因此,鑑於新對象,我仍然無法使用Ember數據來保存或更新它。另外,作爲一個便箋,我不想從API中刪除東西,只是爲了重新創建它們。不是處理數據的好方法。 使用普通的JS和Ajax將解決任何問題。問題是如何用燼數據來完成。 –

2

你可以在它觸發becameValid事件:

record.send("becameValid"); 

這應該轉換模型來未提交狀態。

+2

當模型處於錯誤狀態時,這不起作用。 –

相關問題