From d3e219018bcc698ed8e7ba0eb142310df524cec7 Mon Sep 17 00:00:00 2001 From: did Date: Thu, 24 May 2012 06:46:48 -0700 Subject: [PATCH] fix issue #388 --- .../views/content_entries/_form_view.js.coffee | 6 ++++-- .../locomotive/views/shared/form_view.js.coffee | 3 ++- .../locomotive/backbone.modelbinding.js | 17 +++++++++++++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/locomotive/views/content_entries/_form_view.js.coffee b/app/assets/javascripts/locomotive/views/content_entries/_form_view.js.coffee index 11b1389c..7c3b56d3 100644 --- a/app/assets/javascripts/locomotive/views/content_entries/_form_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/content_entries/_form_view.js.coffee @@ -50,11 +50,13 @@ class Locomotive.Views.ContentEntries.FormView extends Locomotive.Views.Shared.F settings = _.extend {}, @tinyMCE_settings(), oninit: ((editor) => $.cmd 'S', (() => - $(textarea).val(editor.getBody().innerHTML).trigger('change') + editor.save() + $(textarea).trigger('changeSilently') @$('form').trigger('submit') ), [], ignoreCase: true, document: editor.dom.doc), onchange_callback: (editor) => - $(textarea).val(editor.getBody().innerHTML).trigger('change') + editor.save() + $(textarea).trigger('changeSilently') $(textarea).tinymce(settings) diff --git a/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee b/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee index 0034de82..4cbf70eb 100644 --- a/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee @@ -36,7 +36,8 @@ class Locomotive.Views.Shared.FormView extends Backbone.View previous_attributes = _.clone @model.attributes @model.save {}, - headers: options.headers + headers: options.headers + silent: true # since we pass an empty hash above, no need to trigger the callbacks success: (model, response, xhr) => form.trigger('ajax:complete') diff --git a/vendor/assets/javascripts/locomotive/backbone.modelbinding.js b/vendor/assets/javascripts/locomotive/backbone.modelbinding.js index 80b6b869..597bf413 100644 --- a/vendor/assets/javascripts/locomotive/backbone.modelbinding.js +++ b/vendor/assets/javascripts/locomotive/backbone.modelbinding.js @@ -64,10 +64,13 @@ Backbone.ModelBinding = (function(Backbone, _, $){ this.modelBindings.push({model: model, eventName: eventName, callback: callback}); } - this.registerElementBinding = function(element, callback){ + this.registerElementBinding = function(element, callback, callbackSilently){ // bind the form changes to the model element.bind("change", callback); this.elementBindings.push({element: element, eventName: "change", callback: callback}); + + if (callbackSilently) + element.bind("changeSilently", callbackSilently) } } @@ -188,18 +191,24 @@ Backbone.ModelBinding = (function(Backbone, _, $){ element.val(val); }; - var setModelValue = function(attr_name, value){ + var setModelValue = function(attr_name, value, silent){ + if (typeof(silent) === 'undefined' || silent == null) silent = false var data = {}; data[attr_name] = value; - model.set(data); + model.set(data, { 'silent': silent }); }; var elementChange = function(ev){ setModelValue(attribute_name, view.$(ev.target).val()); }; + // FIXME (Did): simple solution to update the model without triggering related callbacks (solving a bug with tinymce) + var elementChangeSilently = function(ev) { + setModelValue(attribute_name, view.$(ev.target).val(), true); + } + modelBinder.registerModelBinding(model, attribute_name, modelChange); - modelBinder.registerElementBinding(element, elementChange); + modelBinder.registerElementBinding(element, elementChange, elementChangeSilently); // set the default value on the form, from the model var attr_value = model.get(attribute_name);