Todoアプリケーション(削除ボタン追加)

Spine.jsで簡易Todoアプリケーションを作ってみる。ちなみに最新版のSpine.jsとjquery.tmpl.jsで

by FiNGAHOLiC

HTML

<script src="https://raw.github.com/jquery/jquery-tmpl/master/jquery.tmpl.min.js"></script>
<script src="https://raw.github.com/maccman/spine/master/lib/spine.js"></script>
<script src="https://raw.github.com/maccman/spine/master/lib/local.js"></script>
<div id="mod-app">
    <header>簡易Todoアプリ</header>
    <div id="mod-register">
        <input type="text"><button class="create">create</button>
    </div>
    <ul id="mod-lists"></ul>
</div>

<script type="text/x-jquery-tmpl" id="mod-tmpl-task">
    <span>${task}</span><button class="delete">delete</button>
</script>

JavaScript

(function($, window, document, undefined){

    // Taskモデル
    var Task = Spine.Model.sub();
    Task.configure('Task', 'task');
    Task.extend(Spine.Model.Local);
    
    // Tasksコントローラ
    var Tasks = Spine.Controller.sub({
        // 生成する初期要素をli要素に
        tag: 'li',
        // deleteボタンが押下されたらdeleteメソッドを叩く
        events: {
            'click .delete': 'delete'
        },
        init: function(){
            // 削除されたらreleaseメソッドでel要素を削除
            this.item.bind('destroy', this.release);
        },
        delete: function(){
            // 選択されたモデルデータを削除
            this.item.destroy();
        },
        render: function(){
            // モデルデータを元にel要素に代入
            this.el.html($('#mod-tmpl-task').tmpl(this.item));
            return this;
        }
    });
    
    // Appコントローラ
    var TaskApp = Spine.Controller.sub({
        // createボタンが押下されたらcreateメソッドを叩く
        events: {
            'click .create': 'create'
        },
        elements: {
            '#mod-lists': 'items',
            'input[type=text]': 'input'
        },
        init: function(){
            // 新規タスクが作成されたらaddメソッドを叩く
            Task.bind('create', this.proxy(this.add));
            // fetchされたらaddAllメソッドを叩く
            Task.bind('refresh', this.proxy(this.addAll));
            // モデルデータをローカルストレージから取得
            Task.fetch();
        },
        add: function(task){
            // 新規ビューを作成
            var view = new Tasks({
                item: task
            });
            // ビューを描画
            this.items.append(view.render().el);
        },
        addAll: function(){
            // fetchされたらローカルストレージから取得した全モデルデータをaddメソッドで処理
            Task.each(this.proxy(this.add));
        },
        create: function(){
            // 空ならreturn
            if(!this.input.val()) return;
            // 新規タスクを作成
            Task.create({
                task: this.input.val()
            });
            // フィールドを空に
            this.input.val('');
            this.input.focus();
       ...