UNPKG

todomvc

Version:

> Helping you select an MV\* framework

111 lines (88 loc) 2.63 kB
/*global define */ define(function (require) { 'use strict'; // Constants var LOCAL_STORAGE_KEY = 'todos-lavaca-require'; var Collection = require('lavaca/mvc/Collection'); /** * A collection of ToDo items that saves and restores its data from * localStorage * @class app.models.TodosCollection * @super Lavaca.mvc.Collection */ var TodosCollection = Collection.extend(function TodosCollection() { // Call the super class' constructor Collection.apply(this, arguments); // Set some computed properties on this model this.apply({ allComplete: allComplete, itemsLeft: itemsLeft, itemsCompleted: itemsCompleted }); // Restore any data from localStorage restore.call(this); // Listen for changes to the models and then save them in localStorage this.on('addItem', store); this.on('moveItem', store); this.on('removeItem', store); this.on('changeItem', store); }, { /** * @method removeCompleted * Remove models that are complete */ removeCompleted: function () { this.remove({completed: true}); } }); /* ---- Computed Properties ---- */ // Returns a boolean indicating whether all items are complete function allComplete() { var allAreComplete = true; this.each(function (index, model) { if (!model.get('completed')) { allAreComplete = false; return false; // break out of `each` loop } }); return allAreComplete; } // Returns a count of incomplete items function itemsLeft() { return this.filter({ completed: false }).length; } // Returns a count of complete items function itemsCompleted() { return this.filter({ completed: true }).length; } /* ---- Handle Persistence ---- */ // Called every time the models change. Set a timeout that will write the data // to localStorage. Clear the timeout with every call to make sure that data // is only written once even if multiple changes are made in the same run loop function store() { var items; clearTimeout(this.storeTimer); this.storeTimer = setTimeout(function () { // Safari will throw an exception when trying to write to localStorage in // private browsing mode try { items = JSON.stringify(this.toObject().items); localStorage.setItem(LOCAL_STORAGE_KEY, items); } catch (e) {} }.bind(this)); } // Pull the data from localStorage and add it to the collection function restore() { var data; var i; try { data = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)); if (data) { for (i = 0; i < data.length; i++) { this.add(data[i]); } } } catch (e) {} } return new TodosCollection(); });