-
Notifications
You must be signed in to change notification settings - Fork 51
/
Model.js
103 lines (83 loc) · 3.16 KB
/
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/**
@property maria.Model
@description
A constructor function to create new model objects.
var model = new maria.Model();
The most interesting feature of model objects is that they are event
targets and so can be observed by any event listeners. Other model
objects, view objects, or any other interested objects can observe by
being added as event listeners.
For example, the following view object's "update" method will be called
when a "change" event is dispatched on the model objects.
var view = {
update: function(evt) {
alert('The model changed!');
}
};
maria.addEventListener(model, 'change', view, 'update');
The model can dispatch a "change" event on itself when the model
changes.
model.setContent = function(content) {
this._content = content;
model.dispatchEvent({type: 'change'});
};
If desired, a model can push additional data to its observers by
including that data on the event object.
model.setContent = function(content) {
var previousContent = this._content;
this._content = content;
model.dispatchEvent({
type: 'change',
previousContent: previousContent,
content: content
});
};
An event listener can be removed from a model object.
maria.removeEventListener(model, 'change', view, 'update');
A particularly useful pattern is using maria.Model as the "superclass"
of your application's model. The following example shows how this
can be done at a low level for a to-do application.
See maria.Model.subclass for a more compact way to accomplish the same.
checkit.TodoModel = function() {
maria.Model.apply(this, arguments);
};
checkit.TodoModel.prototype = maria.create(maria.Model.prototype);
checkit.TodoModel.prototype.constructor = checkit.TodoModel;
checkit.TodoModel.prototype._content = '';
checkit.TodoModel.prototype._isDone = false;
checkit.TodoModel.prototype.getContent = function() {
return this._content;
};
checkit.TodoModel.prototype.setContent = function(content) {
content = checkit.trim('' + content);
if (this._content !== content) {
this._content = content;
this.dispatchEvent({type: 'change'});
}
};
checkit.TodoModel.prototype.isDone = function() {
return this._isDone;
};
checkit.TodoModel.prototype.setDone = function(isDone) {
isDone = !!isDone;
if (this._isDone !== isDone) {
this._isDone = isDone;
this.dispatchEvent({type: 'change'});
}
};
checkit.TodoModel.prototype.toggleDone = function() {
this.setDone(!this.isDone());
};
When a model's "destroy" method is called, a "destroy" event is
dispatched and all event listeners who've been added for this event
type will be notified.
(See evento.EventTarget for advanced information about event bubbling
using "addParentEventTarget" and "removeParentEventTarget".)
*/
maria.Model = function() {
evento.EventTarget.call(this);
};
evento.EventTarget.mixin(maria.Model.prototype);
maria.Model.prototype.destroy = function() {
this.dispatchEvent({type: 'destroy'});
};