2015-06-15 102 views
3

我現在正在測試雙向數據綁定的backbone骨架。有沒有辦法恢復的變更,例如,當通過表單編輯模型數據,用戶按下取消按鈕,如PIC下面backbone backbone stickit - 還原模型更改

enter image description here

似乎模型上的改變在我們輸入表單時飛行。我想要的是當用戶按下取消按鈕時,模型將恢復到其原始值。

我讀了updateModel需要一個真正的值來確認模型更新。但是怎麼能我的編輯視圖[取消事件]觸發假值的UpdateModel功能,使模型不會與文本字段值進行更新。

我需要類似全局變量的東西嗎?

//global variable 
var updateModelTitle = true; 

//backbone stickit bindings 
    bindings: { 
    '#title': { 
     observe: 'title', 
     updateModel: 'confirmUpdate' 
    } 
    }, 
    confirmUpdate: function(val, event, options) { 
    return updateModelTitle; 
    } 

//cancel button event click event 
updateModelTitle = false; 

在此先感謝您的幫助。

回答

0

這是我解決這個問題的方法。我在骨幹網絡配置中做任何事情。我所做的就是使用模型ID,如果用戶點擊取消按鈕,則從寧靜服務器獲取原始數據。然後使用來自服務器的數據通過stickit 2路綁定來恢復模型更改。

canceledit: function() { 
     var modelIndex = this.model.get('index'); 
     var modelId = this.model.get('id'); 

     this.$el.fadeOut(500, function() { 

      var fetchTask = new App.Models.Task({ id: modelId }); 

      fetchTask.fetch({ 
       wait: true, 
       success: function(model, response, options) { 
        var title = model.get("title"); 
        var task = App.Collections.tasksCollection.at(modelIndex); 
        task.set({title : title}); 
       }, 
       error: function(model, response, options) { 
        console.log('An error occured while fetching the data...'); 
       } 
      }); 

      this.remove(); 
     }); 
    } 

請發表你的答案,如果你有解決方案,不從服務器需要獲取數據通過backbone.stickit恢復模型的變化

更新 - 基於傑克2號建議的解決方案 - 沒有休息調用

//create global variable for model collection index and title properties 
App.Global.modelTaskCurrentTitle = ""; 
App.Global.modelTaskIndex = -1; 

//in edit view render function 
//capture info needed 
App.Global.modelTaskIndex = this.model.get('index'); 
App.Global.modelTaskCurrentTitle = this.model.get('title'); 

//in cancel function for edit-view 
//or any view that need to remove edit-view to prevent zombie-edit-view 
//and also reverting model changes by stickit in edit-view 

//revert stickit changes 
var task = App.Collections.tasksCollection.at(App.Global.modelTaskIndex); 
task.set({title : App.Global.modelTaskCurrentTitle}); 

//remove edit view 
App.Views.editTaskView.remove(); 
+0

類似的東西(但避免到​​服務器之旅),如果有一些操作將視圖置於* edit *模式,那麼您可以做的是製作模型的本地副本,然後使用它重置你的模型,當他們按下取消,或者你做相反的事情,並通過該模型*細節/編輯*視圖,當他們按保存使用,以更新您的模型。 – Jack

+0

我用你的建議編輯答案,謝謝 –

0

我會用

bindings: { 
    '#title': { 
    observe: 'title', 
    event: ['change'] 
    updateModel: function(val, event, options) { 
     if (val) 
     return val; 
    } 
    } 
} 

<form> 
<input id="title" type="text"> 
<button type="Cancel" data-action="destroy-view"> 
<button type="submit">OK</button> 
</form> 

所以model屬性只會在提交時纔會改變。