From 21d9a1c2dc327c25ea0f2642ed01ade5332d767b Mon Sep 17 00:00:00 2001 From: rgrp Date: Sat, 5 Nov 2011 19:48:09 +0000 Subject: [PATCH] [model][m]: (fixes #6) create a BackendMemory (local data in memory) and refactor code to use this rather than current hard-coding-of-data approach. --- demo/js/app.js | 28 +++++++++++++++++-------- src/model.js | 51 ++++++++++++++++++++++++++++++++++++++++------ src/view.js | 8 +++----- test/model.test.js | 43 +++++++++++++++++++++++--------------- 4 files changed, 94 insertions(+), 36 deletions(-) diff --git a/demo/js/app.js b/demo/js/app.js index b24a5623..1e1c4ce6 100755 --- a/demo/js/app.js +++ b/demo/js/app.js @@ -1,8 +1,9 @@ $(function() { + var datasetId = 'test-dataset'; var metadata = { title: 'My Test Dataset' , name: '1-my-test-dataset' - , id: 1 + , id: datasetId }; var indata = { headers: ['x', 'y', 'z'] @@ -15,14 +16,23 @@ $(function() { , {x: 6, y: 12, z: 18} ] }; - var dataset = new recline.Dataset(metadata, indata); - - var dataTable = new recline.DataTable({ - model: dataset.documentSet, - url: "awesome.com/webstore.json" - }) - - $('.container').append(dataTable.el) + // this is all rather artificial here but would make more sense with more complex backend + backend = new recline.BackendMemory(); + backend.addDataset({ + metadata: metadata, + data: indata + }); + recline.setBackend(backend); + var dataset = backend.getDataset(datasetId); + dataset.fetch().then(function() { + console.log(dataset.documentSet); + var dataTable = new recline.DataTable({ + model: dataset.documentSet, + url: "awesome.com/webstore.json" + }) + + $('.container').append(dataTable.el) + }); }) // app.after = { diff --git a/src/model.js b/src/model.js index 9e34392e..3925002e 100644 --- a/src/model.js +++ b/src/model.js @@ -2,9 +2,7 @@ this.recline = this.recline || {}; // A Dataset model. recline.Dataset = Backbone.Model.extend({ - initialize: function(data, rawDocumentSet) { - this.documentSet = new recline.DocumentSet(rawDocumentSet); - } + __type__: 'Dataset' }); recline.Document = Backbone.Model.extend({}); @@ -15,9 +13,7 @@ recline.DocumentList = Backbone.Collection.extend({ }) recline.DocumentSet = Backbone.Model.extend({ - fetch: function(options) { - options.success(this); - }, + __type__: 'DocumentSet', getLength: function() { return this.get('rows').length; }, @@ -35,3 +31,46 @@ recline.DocumentSet = Backbone.Model.extend({ } }); +// Backend which just caches in memory +// +// Does not need to be a backbone model but provides some conveience +recline.BackendMemory = Backbone.Model.extend({ + initialize: function() { + this._datasetCache = {} + }, + // dataset is object with metadata and data attributes + addDataset: function(dataset) { + this._datasetCache[dataset.metadata.id] = dataset; + }, + getDataset: function(id) { + var dataset = new recline.Dataset({ + id: id + }); + // this is a bit weird but problem is in sync this is set to parent model object so need to give dataset a reference to backend explicitly + dataset.backend = this; + return dataset; + }, + sync: function(method, model, options) { + 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._datasetCache[model.id]; + dataset.set(rawDataset.metadata); + dataset.documentSet = new recline.DocumentSet(rawDataset.data); + dataset.documentSet.dataset = dataset; + dfd.resolve(dataset); + } else if (this.__type__ == 'DocumentSet') { + dfd.resolve(this); + } + return dfd.promise(); + } + } +}); + +recline.setBackend = function(backend) { + Backbone.sync = backend.sync; +}; + diff --git a/src/view.js b/src/view.js index 3375f67b..8dd9a0a7 100644 --- a/src/view.js +++ b/src/view.js @@ -13,10 +13,8 @@ recline.DataTable = Backbone.View.extend({ initialize: function() { var that = this; - this.model.fetch({ - success: function(collection, resp) { - that.render() - } + this.model.fetch().then(function() { + that.render() }) }, toTemplateJSON: function() { @@ -37,4 +35,4 @@ recline.DataTable = Backbone.View.extend({ $(this.el).html(htmls); return this; } -}); \ No newline at end of file +}); diff --git a/test/model.test.js b/test/model.test.js index 41141ae6..753dc1ef 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -3,10 +3,11 @@ module("Dataset"); test('new Dataset', function () { + var datasetId = 'test-dataset'; var metadata = { title: 'My Test Dataset' , name: '1-my-test-dataset' - , id: 1 + , id: datasetId }; var indata = { headers: ['x', 'y', 'z'] @@ -19,23 +20,33 @@ test('new Dataset', function () { , {x: 6, y: 12, z: 18} ] }; - var dataset = new recline.Dataset(metadata, indata); - equal(dataset.get('name'), metadata.name); + // this is all rather artificial here but would make more sense with more complex backend + backend = new recline.BackendMemory(); + backend.addDataset({ + metadata: metadata, + data: indata + }); + recline.setBackend(backend); + var dataset = backend.getDataset(datasetId); expect(6); - setTimeout(2); - dataset.documentSet.fetch({ - success: function(documentSet) { - equal(documentSet.get('headers'), indata.headers); - equal(documentSet.getLength(), 6); - documentSet.getRows(4, 2).then(function(rows) { - equal(rows[0], indata.rows[2]); - }); - documentSet.getRows().then(function(rows) { - equal(rows.length, Math.min(10, indata.rows.length)); - equal(rows[0], indata.rows[0]); - }); - } + dataset.fetch().then(function(dataset) { + equal(dataset.get('name'), metadata.name); + dataset.documentSet.fetch().then(testDS); }); + function testDS(documentSet) { + equal(documentSet.get('headers'), indata.headers); + equal(documentSet.getLength(), 6); + documentSet.getRows(4, 2).then(function(rows) { + equal(rows[0], indata.rows[2]); + }); + documentSet.getRows().then(function(rows) { + equal(rows.length, Math.min(10, indata.rows.length)); + equal(rows[0], indata.rows[0]); + }); + } +}); + +test('Local Data Sync', function() { }); })(this.jQuery);