From ce076a2eac6eb8c4b0008cff513fe52e4f6fa87e Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Thu, 5 Jan 2012 01:39:31 +0000 Subject: [PATCH] [model/backend,#6][s]: BackendMemory now supports saving of Documents. --- src/model.js | 28 +++++++++++++++++++++++----- test/model.test.js | 12 +++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/model.js b/src/model.js index 39ff8999..8680fec2 100644 --- a/src/model.js +++ b/src/model.js @@ -36,12 +36,15 @@ my.Dataset = Backbone.Model.extend({ } }); -my.Document = Backbone.Model.extend({}); +my.Document = Backbone.Model.extend({ + __type__: 'Document' +}); my.DocumentList = Backbone.Collection.extend({ + __type__: 'DocumentList', // webStore: new WebStore(this.url), model: my.Document -}) +}); // Backends section // ================ @@ -77,6 +80,7 @@ my.BackendMemory = Backbone.Model.extend({ initialize: function(dataset) { // deep copy this._datasetAsData = _.extend({}, dataset); + _.bindAll(this, 'sync'); }, getDataset: function() { var dataset = new my.Dataset({ @@ -87,13 +91,14 @@ my.BackendMemory = Backbone.Model.extend({ return dataset; }, sync: function(method, model, options) { + var self = this; if (method === "read") { var dfd = $.Deferred(); // this switching on object type is rather horrible // think may make more sense to do work in individual objects rather than in central Backbone.sync - if (this.__type__ == 'Dataset') { - var dataset = this; - var rawDataset = this.backend._datasetAsData; + if (model.__type__ == 'Dataset') { + var dataset = model; + var rawDataset = this._datasetAsData; dataset.set(rawDataset.metadata); dataset.set({ headers: rawDataset.data.headers @@ -102,6 +107,19 @@ my.BackendMemory = Backbone.Model.extend({ dfd.resolve(dataset); } return dfd.promise(); + } else if (method === 'update') { + var dfd = $.Deferred(); + if (model.__type__ == 'Document') { + _.each(this._datasetAsData.data.rows, function(row, idx) { + if(row.id === model.id) { + self._datasetAsData.data.rows[idx] = model.toJSON(); + } + }); + dfd.resolve(model); + } + return dfd.promise(); + } else { + alert('Not supported: sync on BackendMemory with method ' + method + ' and model ' + model); } }, getRows: function(datasetId, numRows, start) { diff --git a/test/model.test.js b/test/model.test.js index f2b628b7..0234610d 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -27,7 +27,7 @@ test('new Dataset', function () { }); recline.Model.setBackend(backend); var dataset = backend.getDataset(datasetId); - expect(6); + expect(7); dataset.fetch().then(function(dataset) { equal(dataset.get('name'), metadata.name); equal(dataset.get('headers'), indata.headers); @@ -37,8 +37,14 @@ test('new Dataset', function () { }); dataset.getRows().then(function(docList) { equal(docList.length, Math.min(10, indata.rows.length)); - deepEqual(docList.models[0].toJSON(), indata.rows[0]); - }); + var doc1 = docList.models[0]; + deepEqual(doc1.toJSON(), indata.rows[0]); + var newVal = 10; + doc1.set({x: newVal}); + doc1.save().then(function() { + equal(backend._datasetAsData.data.rows[0].x, newVal); + }) + }); }); });