todomvc
Version:
> Helping you select an MV\* framework
97 lines (79 loc) • 1.93 kB
JavaScript
/*jshint strict: false */
/*global maria, checkit */
maria.SetModel.subclass(checkit, 'TodosModel', {
properties: {
_mode: 'all',
getPossibleModes: function () {
return ['all', 'incompleted', 'completed'];
},
getMode: function () {
return this._mode;
},
setMode: function (mode) {
var modePossible = this.getPossibleModes().some(function (m) {
return m === mode;
});
if (modePossible) {
if (this._mode !== mode) {
this._mode = mode;
this.dispatchEvent({ type: 'change' });
}
} else {
throw new Error('checkit.TodosModel.prototype.setMode: unsupported mode "' + mode + '".');
}
},
getCompleted: function () {
var completeTodos = [];
this.forEach(function (todo) {
if (todo.isCompleted()) {
completeTodos.push(todo);
}
});
return completeTodos;
},
getIncompleted: function () {
var incompleteTodos = [];
this.forEach(function (todo) {
if (!todo.isCompleted()) {
incompleteTodos.push(todo);
}
});
return incompleteTodos;
},
isAllCompleted: function () {
return (this.size > 0) && (this.getCompleted().length === this.size);
},
isEmpty: function () {
return this.size === 0;
},
markAllCompleted: function () {
this.forEach(function (todo) {
todo.setCompleted(true);
});
},
markAllIncompleted: function () {
this.forEach(function (todo) {
todo.setCompleted(false);
});
},
deleteCompleted: function () {
this['delete'].apply(this, this.getCompleted());
},
toJSON: function () {
var todoJSON = [];
this.forEach(function (todo) {
todoJSON.push(todo.toJSON());
});
return todoJSON;
}
}
});
checkit.TodosModel.fromJSON = function (todosJSON) {
var model = new checkit.TodosModel();
var i;
var ilen;
for (i = 0, ilen = todosJSON.length; i < ilen; i++) {
model.add(checkit.TodoModel.fromJSON(todosJSON[i]));
}
return model;
};