<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    First Step to Backbone Js


    JUMP TO …

    refer to:
     
    http://documentcloud.github.com/backbone/docs/todos.html

    todos.js

    An example Backbone application contributed by Jérôme Gravel-Niquet. This demo uses a simple LocalStorage adapter to persist Backbone models within your browser.

    Load the application once the DOM is ready, using jQuery.ready:

    $(function(){

    Todo Model

    Our basic Todo model has titleorder, and done attributes.

      var Todo = Backbone.Model.extend({

    Default attributes for the todo item.

        defaults: function() {       return {         title: "empty todo...",         order: Todos.nextOrder(),         done: false       };     },

    Ensure that each todo created has title.

        initialize: function() {       if (!this.get("title")) {         this.set({"title": this.defaults.title});       }     },

    Toggle the done state of this todo item.

        toggle: function() {       this.save({done: !this.get("done")});     },

    Remove this Todo from localStorage and delete its view.

        clear: function() {       this.destroy();     }    });

    Todo Collection

    The collection of todos is backed by localStorage instead of a remote server.

      var TodoList = Backbone.Collection.extend({

    Reference to this collection's model.

        model: Todo,

    Save all of the todo items under the "todos" namespace.

        localStorage: new Store("todos-backbone"),

    Filter down the list of all todo items that are finished.

        done: function() {       return this.filter(function(todo){ return todo.get('done'); });     },

    Filter down the list to only todo items that are still not finished.

        remaining: function() {       return this.without.apply(this, this.done());     },

    We keep the Todos in sequential order, despite being saved by unordered GUID in the database. This generates the next order number for new items.

        nextOrder: function() {       if (!this.length) return 1;       return this.last().get('order') + 1;     },

    Todos are sorted by their original insertion order.

        comparator: function(todo) {       return todo.get('order');     }    });

    Create our global collection of Todos.

      var Todos = new TodoList;

    Todo Item View

    The DOM element for a todo item...

      var TodoView = Backbone.View.extend({

    ... is a list tag.

        tagName:  "li",

    Cache the template function for a single item.

        template: _.template($('#item-template').html()),

    The DOM events specific to an item.

        events: {       "click .toggle"   : "toggleDone",       "dblclick .view"  : "edit",       "click a.destroy" : "clear",       "keypress .edit"  : "updateOnEnter",       "blur .edit"      : "close"     },

    The TodoView listens for changes to its model, re-rendering. Since there's a one-to-one correspondence between a Todo and a TodoViewin this app, we set a direct reference on the model for convenience.

        initialize: function() {       this.model.bind('change', this.render, this);       this.model.bind('destroy', this.remove, this);     },

    Re-render the titles of the todo item.

        render: function() {       this.$el.html(this.template(this.model.toJSON()));       this.$el.toggleClass('done', this.model.get('done'));       this.input = this.$('.edit');       return this;     },

    Toggle the "done" state of the model.

        toggleDone: function() {       this.model.toggle();     },

    Switch this view into "editing" mode, displaying the input field.

        edit: function() {       this.$el.addClass("editing");       this.input.focus();     },

    Close the "editing" mode, saving changes to the todo.

        close: function() {       var value = this.input.val();       if (!value) this.clear();       this.model.save({title: value});       this.$el.removeClass("editing");     },

    If you hit enter, we're through editing the item.

        updateOnEnter: function(e) {       if (e.keyCode == 13) this.close();     },

    Remove the item, destroy the model.

        clear: function() {       this.model.clear();     }    });

    The Application

    Our overall AppView is the top-level piece of UI.

      var AppView = Backbone.View.extend({

    Instead of generating a new element, bind to the existing skeleton of the App already present in the HTML.

        el: $("#todoapp"),

    Our template for the line of statistics at the bottom of the app.

        statsTemplate: _.template($('#stats-template').html()),

    Delegated events for creating new items, and clearing completed ones.

        events: {       "keypress #new-todo":  "createOnEnter",       "click #clear-completed": "clearCompleted",       "click #toggle-all": "toggleAllComplete"     },

    At initialization we bind to the relevant events on the Todos collection, when items are added or changed. Kick things off by loading any preexisting todos that might be saved in localStorage.

        initialize: function() {        this.input = this.$("#new-todo");       this.allCheckbox = this.$("#toggle-all")[0];        Todos.bind('add', this.addOne, this);       Todos.bind('reset', this.addAll, this);       Todos.bind('all', this.render, this);        this.footer = this.$('footer');       this.main = $('#main');        Todos.fetch();     },

    Re-rendering the App just means refreshing the statistics -- the rest of the app doesn't change.

        render: function() {       var done = Todos.done().length;       var remaining = Todos.remaining().length;        if (Todos.length) {         this.main.show();         this.footer.show();         this.footer.html(this.statsTemplate({done: done, remaining: remaining}));       } else {         this.main.hide();         this.footer.hide();       }        this.allCheckbox.checked = !remaining;     },

    Add a single todo item to the list by creating a view for it, and appending its element to the <ul>.

        addOne: function(todo) {       var view = new TodoView({model: todo});       this.$("#todo-list").append(view.render().el);     },

    Add all items in the Todos collection at once.

        addAll: function() {       Todos.each(this.addOne);     },

    If you hit return in the main input field, create new Todo model, persisting it to localStorage.

        createOnEnter: function(e) {       if (e.keyCode != 13) return;       if (!this.input.val()) return;        Todos.create({title: this.input.val()});       this.input.val('');     },

    Clear all done todo items, destroying their models.

        clearCompleted: function() {       _.each(Todos.done(), function(todo){ todo.clear(); });       return false;     },      toggleAllComplete: function () {       var done = this.allCheckbox.checked;       Todos.each(function (todo) { todo.save({'done': done}); });     }    });

    Finally, we kick things off by creating the App.

      var App = new AppView;  });  


    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2012-03-25 16:53 Chan Chen 閱讀(293) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 暖暖免费日本在线中文| xvideos永久免费入口| 四虎1515hh永久久免费| 精品日韩亚洲AV无码| 最近2019免费中文字幕视频三| 亚洲国产精品无码中文字| a级片免费在线播放| 亚洲大成色www永久网站| a毛片在线免费观看| 亚洲一区免费观看| 美女内射毛片在线看免费人动物 | 免费中文字幕不卡视频| 久久亚洲精品11p| 亚洲综合精品网站| 另类免费视频一区二区在线观看 | 日韩亚洲欧洲在线com91tv| 久久国产乱子伦精品免费看| 亚洲日韩乱码中文无码蜜桃臀| 毛片a级毛片免费观看品善网| 青青青亚洲精品国产| 老司机亚洲精品影视www| 日韩免费人妻AV无码专区蜜桃| 亚洲影视自拍揄拍愉拍| 国产成人aaa在线视频免费观看| 国产成人精品免费视频大全| 亚洲阿v天堂在线| 在线观看日本免费a∨视频| 无人视频免费观看免费视频| 久久久久久久尹人综合网亚洲| 91免费国产自产地址入| 亚洲AV无码一区二区三区牲色| 在线观看亚洲天天一三视| 国产成人yy免费视频| 一级毛片在线免费视频| 色婷婷六月亚洲婷婷丁香| 国产a级特黄的片子视频免费| 久久午夜无码免费| 美女视频黄a视频全免费网站色| 亚洲色四在线视频观看| 国产高清在线免费视频| 鲁丝片一区二区三区免费|