[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.

This commit is contained in:
rgrp 2011-11-05 19:48:09 +00:00
parent bd52bb2c58
commit 21d9a1c2dc
4 changed files with 94 additions and 36 deletions

View File

@ -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 = {

View File

@ -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;
};

View File

@ -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;
}
});
});

View File

@ -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);