backbone_Collection的create,add,push,unshift

1. model定义

var app = app || {};

(function () {
    ‘use strict‘;

    // User Model
    // ----------

    app.User = Backbone.Model.extend({

        defaults: {
            firstName: ‘‘,
            lastName: ‘‘,
            telNo:‘‘,
            email:‘‘
        },

    });
})();

2.Collection定义

var app = app || {};

(function () {
    ‘use strict‘;

    var Users = Backbone.Collection.extend({
        // Reference to this collection‘s model.
        model: app.User,

        // Save all of the todo items under the `"todos"` namespace.
        localStorage: new Backbone.LocalStorage(‘users-backbone‘),

    });

    // Create our global collection of **Users**.
    app.users = new Users();
})();

3. View

/*global Backbone, jQuery, _, ENTER_KEY */
var app = app || {};

(function ($) {
    ‘use strict‘;

    app.AppView = Backbone.View.extend({

        //el: ‘.user-list-tb‘,
        el: ‘.container‘,

        events: {
            ‘click #register-btn‘: ‘register‘,
            ‘click #add-btn‘: ‘add‘,
            ‘click #push-btn‘: ‘push‘,
            ‘click #unshift-btn‘: ‘unshift‘,
            //‘click #add‘: ‘register‘,
        },

        initialize: function() {
            this.$list = $(‘#user-list-bd‘);
            //this.$list = $(‘#user-list‘);

            this.listenTo(app.users, ‘add‘, this.addOne);
            this.listenTo(app.users, ‘reset‘, this.addAll);
            //this.listenTo(app.users, ‘all‘, _.debounce(this.render, 0));

            app.users.fetch({reset: true});
        },

        /*render: function() {

        },*/

        newAttributes: function() {
            return {
                firstName:this.$("#firstname").val(),
                lastName:this.$("#lastname").val(),
                telNo:this.$("#telNo").val(),
                email:this.$("#email").val(),
            };
        },

        register: function() {

            var a = this.newAttributes();
            app.users.create(a);

        },

        addOne: function(user) {
            var view = new app.UserlistView({ model: user });
            this.$list.append(view.render().el);
            //$(‘#aa‘).append("<span>bb</span>");

        },

        addAll: function() {
            ///this.$list.html(‘‘);
            app.users.each(this.addOne, this);

        },

        add: function(){
            var a = this.newAttributes();
            app.users.add(a,{at:2});
            console.dir(app.users);
        },

        push: function(){
            var a = this.newAttributes();
            app.users.push(a);
            console.dir(app.users.models);
        },

        unshift: function(){
            var a = this.newAttributes();
            app.users.unshift(a);
            console.dir(app.users);
        }

    });
})(jQuery);
/*global Backbone, jQuery, _, ENTER_KEY */
var app = app || {};

(function ($) {
    ‘use strict‘;

    app.UserlistView = Backbone.View.extend({
        tagName:  ‘tr‘,
        //tagName:  ‘li‘,

        template: _.template($(‘#user-list‘).html()),
        //template: _.template(‘<div><%= firstName %>:<%= telNo %></div>‘),

        initialize: function () {

            this.listenTo(this.model, ‘change‘, this.render);
        },

        // Re-render the titles of the todo item.
        render: function () {

            /*if (this.model.changed.id !== undefined) {
                return;
            }

            this.$el.html(this.template(this.model.toJSON()));
            this.$el.toggleClass(‘completed‘, this.model.get(‘completed‘));
            this.toggleVisible();
            this.$input = this.$(‘.edit‘);
            return this;*/
            var a = this.template(this.model.toJSON());
            this.$el.html(a);
            return this;
        },

    });
})(jQuery);

4. create,add,push,unshift

首先看下create的源代码

    // Create a new instance of a model in this collection. Add the model to the
    // collection immediately, unless `wait: true` is passed, in which case we
    // wait for the server to agree.
    create: function(model, options) {
      options = options ? _.clone(options) : {};
      var wait = options.wait;
      if (!(model = this._prepareModel(model, options))) return false;
      if (!wait) this.add(model, options);
      var collection = this;
      var success = options.success;
      options.success = function(model, resp, callbackOpts) {
        if (wait) collection.add(model, callbackOpts);
        if (success) success.call(callbackOpts.context, model, resp, callbackOpts);
      };
      model.save(null, options);
      return model;
    },

从源代码来看,create调用model的add方法,然后又调用了save方法,save方法将保存模型到数据库(或替代持久化层)。

create方法触发collection的add事件和sync事件。

再看下add,push,unshift的源代码

// Add a model, or list of models to the set.
add: function(models, options) {
      return this.set(models, _.extend({merge: false}, options, addOptions));
    },

// Add a model to the end of the collection.
    push: function(model, options) {
      return this.add(model, _.extend({at: this.length}, options));

    },

    unshift: function(model, options) {
      return this.add(model, _.extend({at: 0}, options));
    },

add方法是向集合中增加一个模型(或一个模型数组),触发"add"事件。

传递{at: index}可以将模型插入集合中特定的index索引位置。

push是向集合的末尾增加一个模型。

而unshift是向集合的头上追加一个模型。

当然我们调用的时候,还可以指定option,比如{at: 2}来更改插入位置。

从上面的源代码可以看出,上面3个函数归根结底都是调用set函数,并没有调用save,所以不会将新增加的模型保存到服务器。

5. 关于set方法

http://www.css88.com/doc/backbone/#Collection-set

上是这样解释的:

set方法通过传递模型列表执行一个集合的"smart(智能)"的更新。 如果列表中的一个模型尚不在集合中,那么它将被添加; 如果模型已经在集合中,其属性将被合并; 并且如果集合包含存在于列表中的任何模型,他们将被删除。 以上所有将触发相应的"add", "remove", 和 "change"事件。 返回集合中的模型。 如果您想自定义的行为, 你可以设置选项:{add: false}, {remove: false}, 或 {merge: false},将其禁用。

时间: 2024-10-09 15:55:35

backbone_Collection的create,add,push,unshift的相关文章

Javascript数组中shift()和push(),unshift()和pop()操作方法使用

Javascript为数组专门提供了push和pop()方法,以便实现类似栈的行为.来看下面的例子: var colors=new Array();       //创建一个数组 var count=colors.push("red","green");   //  推入两项,返回修改后数组的长度 alert(count);   // 2   返回修改后数组的长度 var item=colors.pop();   //取得最后一项 alert(item);     

Javascript的shift()和push(),unshift()和pop()方法简介

栈方法: Javascript为数组专门提供了push()和pop()方法,以便实现类似栈的行为.来看下面的例子: var colors=new Array();       //创建一个数组 var count=colors.push("red","green");   //  推入两项,返回修改后数组的长度 alert(count);   // 2   返回修改后数组的长度 var item=colors.pop();   //取得最后一项 alert(item

[PWA] Add Push Notifications to a PWA with React in Chrome and on Android

On Android and in Chrome (but not on iOS), it's possible to send push notifications with a PWA. We'll start by asking the user for permission to send them push notifications, and then look at how to intercept the push event in a service worker. We ca

push()、shift()与pop()、unshift()、splice()

1.末端的添加和移除:push()是用来在数组末端添加项,pop()在数组末端移除项: 2.前端的添加和移除:shift()在移除数组的第一个项(前端),unshift()在数组前端添加项: 3.push(),unshift()在推入多个项时,各个项之间的顺序不变 4.push(),unshift()将数组的长度+1并返回的是数组的长度,pop(),shift()将数组length-1并返回的是移除的项 例如: var num=new Array(); num.push("1",&qu

原生JS数组方法实现(一)————push()、unshift()、pop()和shift()

push 向数组末尾添加一个或多个元素,并返回数组新的长度 function push(){ for(let i=0;i<arguments.length;i++){ this[this.length] = arguments[i]; } return this.length } Array.prototype.push = push; unshift 向数组开头添加一个或多个元素,并且返回数组新的长度 function unshift(){ //创建一个新数组接收添加的元素 let newAr

Send push notification on Apple (APNS) on c#.net

原文: http://apns-c-sharp-net-vikram-jain.blogspot.com ======================= Please, Install your certificate *.p12 on pc, and take firend name use here for refernce. Please, set configuration file : <appSettings> <add key="FriendName"

[转]How to add new table in NopCommerce

本文转自:http://www.tech-coder.com/2015/07/how-to-add-new-table-in-nopcommerce.html Hey guys I am back after a long time near about 2 year. And hope my previous blogs help's to anyway to my friends. So I am going to starting with NopCommerce for how to a

cocos2d 中 scene(), create(), init() 调用关系

最近在学cocos2d,刚上手时对示例程序的函数调用关系不是很清楚.昨晚刚刚搞清楚,记录下. 1. 首先来看main函数: AppDelegate app; // 创建一个AppDelegate对象 ... return CCApplication::sharedApplication()->run(); // 运行 app 对象 2. 再看 AppDelegate 类: virtual bool applicationDidFinishLaunching(); // CCApplication

Backbone.js源码分析(珍藏版)

源码分析珍藏,方便下次阅读! // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely distributed under the MIT license. // For all details and documentation: // http://backbonejs.org (function () { // 创建一个全局对象, 在浏览器中表示为w