2015-06-15 2 views
3

Теперь я тестирую базовую клавиатуру для двусторонней передачи данных. Есть ли способ, чтобы отменить изменения, например, при редактировании модели данных с помощью формы, пользователь нажал кнопку отмены, как в картинке нижеbackbone stickit - возврат изменений модели

enter image description here

Кажется, модель была изменена на когда мы вводим форму. Я хочу, чтобы пользователь нажал кнопку отмены, модель вернется к исходному значению.

Я прочитал о updateModel, для которого требуется истинное значение для подтверждения обновления модели. Однако, как можно изменить мой ракурс [отменить мероприятие] вызвать ложного значения функцию UpdateModel , так что модель не будет обновляться со значением TextField.

Нужна ли мне что-то вроде глобальной переменной?

//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

Это мое решение этой проблемы. Я ничего не делаю в базовой конфигурации. Я использую идентификатор модели и извлекаю исходные данные с остального сервера, если пользователь нажимает кнопку отмены. Затем используйте данные с сервера, чтобы вернуть изменения модели с помощью привязки 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

UPDATE - 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> 

Таким образом, атрибут модели будет меняться только при отправке.

Смежные вопросы