2014-02-27 20 views
1

我正在使用帶有Ember數據的Ember App Kit創建應用程序。我有一個具有創建和編輯表單的項目資源。出於各種設計原因,我不想讓模型更新或創建,直到用戶點擊保存按鈕。我不確定在Ember中執行此操作的最佳設計模式,因爲默認情況下是將表單字段綁定到更新數據輸入的模型。Ember - 保存的更新模型不是用戶類型

+2

事實上,如果使用Ember Data,我發現了另一個解決方案。我瞭解到模型上有一個「回滾」方法,可以回滾未保存的模型數據。使用模型上的'isDirty'屬性,您可以檢查'willTransition'來查看模型是否有變化,向用戶確認他們想要放棄這些更改,如果是,則使用內置方法回滾它們。非常乾淨,並且需要大量代碼。 – tmartineau

回答

2

您需要在控制器上創建一個臨時屬性。

App.FooController = Em.ObjectController.extend({ 
    userName: '', 

    createData: function() { 
     this.get('store').createRecord({ 
      name: this.get('userName') 
     }).save(); 

     this.set('userName', ''); 
    }, 

    saveData: function() { 
     this.set('model.name', this.get('userName')); 
     this.set('userName', ''); 
    } 
}); 

綁定到userName屬性爲文本字段(或其他),然後,當用戶點擊保存按鈕上傳輸的值。

+0

這很有道理!由於編輯和創建控制器將具有相同的字段,並且表單使用了部分內容,因此您建議使用要在控制器上設置的屬性創建混合內容?感謝解決方案,簡單但會工作得很好。 – tmartineau

+1

我通常只在一個地方編輯數據,所以我從來沒有爲此創建混音。但是,如果我要在多個位置編輯同一類型的對象,我當然會嘗試將其分解爲某種可重用的功能。如果模板總是一樣的話,我會選擇一個視圖或組件。如果模板發生變化,mixin會運行良好。 – GJK

+0

您是否知道Ember中的最佳設計模式,用於實現編輯和創建資源,因爲它們基本上具有相同的功能,但結果稍有不同?也許已經有一些文獻可以指向我了(我在試圖進行快速搜索之前就已經開始了)。感謝您花時間回覆此問題,這真的很有幫助。 – tmartineau

1

或者,您可以創建一個Ember.Object,將模型屬性複製到其中,然後將窗體綁定到該對象。然後在保存時將屬性複製回模型。你可以這樣保存一些代碼。

+0

對,如此相同的主體,但使用Ember對象,而不是直接在控制器上將它們作爲屬性。 – tmartineau

+0

是的,然後你有一個可重用的函數來從模型屬性創建對象。 – buuda