-
Notifications
You must be signed in to change notification settings - Fork 0
/
cached_model.js
88 lines (64 loc) · 2.59 KB
/
cached_model.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Making cached backbone.js models
// Mike Stunes, Wolfe Styke, Frances Zhang
// Callback for persisting a model into the local store
var update_fn = function(m) {
localStorage.setItem(m.get("cache_id"), JSON.stringify(m));
};
// Callback for removing a model from the local store
var destroy_fn = function(m) {
localStorage.removeItem(m.get("cache_id"));
};
// Constructor for a CachedModel object
var CachedModel = Backbone.Model.extend({
constructor: function(attributes, options) {
console.debug("Entering CachedModel.constructor");
// Invoke Model's own constructor first
Backbone.Model.prototype.constructor.call(this, attributes, options);
// Check if cache_id was given to us: if not, generate one
if (!this.get("cache_id")) {
this.set({cache_id: createGUID()});
}
// Attach listeners for persisting and destroying
this._set_listeners();
// Save in cache
update_fn(this);
console.debug("Exiting CachedModel.constructor");
return this;
},
reload_hook: function() {},
_set_listeners: function() {
this.on("change", function() {update_fn(this)});
this.on("destroy", function() {destroy_fn(this)});
},
});
_.extend(CachedModel, {
from_cache: function(cache_id) {
// Check that we were given a cache_id, and that it's actually in the cache
// TODO: if ID not in cache, just make a new object?
if (!cache_id) return;
if (!localStorage.hasOwnProperty(cache_id)) return;
// Fetch old data from the cache before obliterating it by creating a new model
var old_attributes = JSON.parse(localStorage[cache_id]);
// Create a new model, using the usual initialize and constructor of
// whichever type the programmer wants
// It's on the programmer to call from_cache of the right constructor
// function
var new_model = new this({cache_id: cache_id});
// Then, reload all of the old attributes
new_model.set(old_attributes);
new_model.reload_hook();
// new_model should already have listeners set (by "new")
return new_model;
},
});
// Extension of CachedModel, for testing that the correct attributes all stick
// around after reloading from cache
var MyAwesomeModel = CachedModel.extend({
defaults: {"my_class" : "MyAwesomeModel", c:"e", f:"g"},
initialize: function() {
console.debug("MyAwesomeModel.initialize");
},
validate: function(attrs) {
console.debug("MyAwesomeModel.validate");
},
});