You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.4 KiB
126 lines
2.4 KiB
9 years ago
|
/*global Vue, todoStorage */
|
||
|
|
||
|
(function (exports) {
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var filters = {
|
||
|
all: function (todos) {
|
||
|
return todos;
|
||
|
},
|
||
|
active: function (todos) {
|
||
|
return todos.filter(function (todo) {
|
||
|
return !todo.completed;
|
||
|
});
|
||
|
},
|
||
|
completed: function (todos) {
|
||
|
return todos.filter(function (todo) {
|
||
|
return todo.completed;
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
exports.app = new Vue({
|
||
|
|
||
|
// the root element that will be compiled
|
||
|
el: '.todoapp',
|
||
|
|
||
|
// app initial state
|
||
|
data: {
|
||
|
todos: todoStorage.fetch(),
|
||
|
newTodo: '',
|
||
|
editedTodo: null,
|
||
|
visibility: 'all'
|
||
|
},
|
||
|
|
||
|
// watch todos change for localStorage persistence
|
||
|
watch: {
|
||
|
todos: {
|
||
|
handler: function (todos) {
|
||
|
todoStorage.save(todos);
|
||
|
},
|
||
|
deep: true
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// computed properties
|
||
|
// http://vuejs.org/guide/computed.html
|
||
|
computed: {
|
||
|
filteredTodos: function () {
|
||
|
return filters[this.visibility](this.todos);
|
||
|
},
|
||
|
remaining: function () {
|
||
|
return filters.active(this.todos).length;
|
||
|
},
|
||
|
allDone: {
|
||
|
get: function () {
|
||
|
return this.remaining === 0;
|
||
|
},
|
||
|
set: function (value) {
|
||
|
this.todos.forEach(function (todo) {
|
||
|
todo.completed = value;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// methods that implement data logic.
|
||
|
// note there's no DOM manipulation here at all.
|
||
|
methods: {
|
||
|
pluralize: function (n) {
|
||
|
return n === 1 ? 'item' : 'items'
|
||
|
},
|
||
|
|
||
|
addTodo: function () {
|
||
|
var value = this.newTodo && this.newTodo.trim();
|
||
|
if (!value) {
|
||
|
return;
|
||
|
}
|
||
|
this.todos.push({ title: value, completed: false });
|
||
|
this.newTodo = '';
|
||
|
},
|
||
|
|
||
|
removeTodo: function (todo) {
|
||
|
this.todos.$remove(todo);
|
||
|
},
|
||
|
|
||
|
editTodo: function (todo) {
|
||
|
this.beforeEditCache = todo.title;
|
||
|
this.editedTodo = todo;
|
||
|
},
|
||
|
|
||
|
doneEdit: function (todo) {
|
||
|
if (!this.editedTodo) {
|
||
|
return;
|
||
|
}
|
||
|
this.editedTodo = null;
|
||
|
todo.title = todo.title.trim();
|
||
|
if (!todo.title) {
|
||
|
this.removeTodo(todo);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
cancelEdit: function (todo) {
|
||
|
this.editedTodo = null;
|
||
|
todo.title = this.beforeEditCache;
|
||
|
},
|
||
|
|
||
|
removeCompleted: function () {
|
||
|
this.todos = filters.active(this.todos);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// a custom directive to wait for the DOM to be updated
|
||
|
// before focusing on the input field.
|
||
|
// http://vuejs.org/guide/custom-directive.html
|
||
|
directives: {
|
||
|
'todo-focus': function (el, value) {
|
||
|
if (value) {
|
||
|
el.focus();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
})(window);
|