Show More
@@ -32,6 +32,7 b' function(WidgetManager, _, Backbone){' | |||
|
32 | 32 | // An ID unique to this model. |
|
33 | 33 | // comm : Comm instance (optional) |
|
34 | 34 | this.widget_manager = widget_manager; |
|
35 | this._set_calls = 0; | |
|
35 | 36 | this.pending_msgs = 0; |
|
36 | 37 | this.msg_throttle = 3; |
|
37 | 38 | this.msg_buffer = null; |
@@ -135,6 +136,12 b' function(WidgetManager, _, Backbone){' | |||
|
135 | 136 | return callbacks; |
|
136 | 137 | }, |
|
137 | 138 | |
|
139 | set: function(key, val, options) { | |
|
140 | // Set a value. | |
|
141 | this._set_calls++; | |
|
142 | return WidgetModel.__super__.set.apply(this, arguments); | |
|
143 | }, | |
|
144 | ||
|
138 | 145 | sync: function (method, model, options) { |
|
139 | 146 | // Handle sync to the back-end. Called when a model.save() is called. |
|
140 | 147 | |
@@ -158,6 +165,7 b' function(WidgetManager, _, Backbone){' | |||
|
158 | 165 | } |
|
159 | 166 | |
|
160 | 167 | // Only sync if there are attributes to send to the back-end. |
|
168 | attrs = this._pack_models(attrs); | |
|
161 | 169 | if (_.size(attrs) > 0) { |
|
162 | 170 | |
|
163 | 171 | // If this message was sent via backbone itself, it will not |
@@ -197,13 +205,26 b' function(WidgetManager, _, Backbone){' | |||
|
197 | 205 | // Since the comm is a one-way communication, assume the message |
|
198 | 206 | // arrived. Don't call success since we don't have a model back from the server |
|
199 | 207 | // this means we miss out on the 'sync' event. |
|
208 | this._set_calls = 0; | |
|
200 | 209 | }, |
|
201 | 210 | |
|
202 | 211 | save_changes: function(callbacks) { |
|
203 | 212 | // Push this model's state to the back-end |
|
204 | 213 | // |
|
205 | 214 | // This invokes a Backbone.Sync. |
|
206 | this.save(this.changedAttributes(), {patch: true, callbacks: callbacks}); | |
|
215 | ||
|
216 | // Backbone only remembers the diff of the most recent set() | |
|
217 | // opertation. Calling set multiple times in a row results in a | |
|
218 | // loss of diff information which means we need to send a full | |
|
219 | // state. If diffing is important to the user, model.set(...) should | |
|
220 | // only be called once prior to a view.touch(). If multiple | |
|
221 | // parameters need to be set, use the model.set({key1: val1, key2: val2, ...}) | |
|
222 | // signature. | |
|
223 | if (self._set_calls <= 1) { | |
|
224 | this.save(this.changedAttributes(), {patch: true, callbacks: callbacks}); | |
|
225 | } else { | |
|
226 | this.save(null, {patch: false, callbacks: callbacks}); | |
|
227 | } | |
|
207 | 228 | }, |
|
208 | 229 | |
|
209 | 230 | _pack_models: function(value) { |
General Comments 0
You need to be logged in to leave comments.
Login now