Backbone / Underscore uniqueId()奇数

时间:2012-10-31 20:42:54

标签: backbone.js underscore.js uniqueidentifier

我对Backbone和Underscore相对较新,并且其中一个问题不是真正的问题 - 只是出于好奇而烦恼。

我构建了一个非常简单的应用程序,允许您在集合中添加和删除模型,并在浏览器中呈现它们。它还具有console.log集合的能力(所以我可以看到我的集合)。

这是奇怪的事情:生成的ID是1,3,5...,依此类推。我的代码是否有特定原因,或与BB / US有关?

这是一个有效的小提琴:http://jsfiddle.net/ptagp/

代码:

App = (function(){

var AppModel = Backbone.Model.extend({

    defaults: {
        id: null,
        item: null
    }

});

var AppCollection = Backbone.Collection.extend({

    model: AppModel

});

var AppView = Backbone.View.extend({

    el: $('#app'),

    newfield: $('#new-item'),

    initialize: function(){
        this.el = $(this.el);
    },

    events: {
        'click #add-new': 'addItem',
        'click .remove-item': 'removeItem',
        'click #print-collection': 'printCollection'
    },

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

    render: function(model){
        var templ = _.template(this.template);
        this.el.append(templ({
            id: model.get('id'),
            item: model.get('item')
        }));
    },

    addItem: function(){
        var NewModel = new AppModel({
            id: _.uniqueId(),
            item: this.newfield.val()
        });
        this.collection.add(NewModel);
        this.render(NewModel);  
    },

    removeItem: function(e){
        var id = this.$(e.currentTarget).parent('div').data('id');
        var model = this.collection.get(id);
        this.collection.remove(model);
        $(e.target).parent('div').remove();
    },

    printCollection: function(){
        this.collection.each(function(model){
            console.log(model.get('id')+': '+model.get('item'));
        });
    }

});

return {
    start: function(){
        new AppView({
            collection: new AppCollection()
        });
    }
};

});

$(function(){ new App().start(); });

1 个答案:

答案 0 :(得分:8)

如果您查看backbone.js源代码,您会注意到_.uniqueId用于设置模型cidhttps://github.com/documentcloud/backbone/blob/master/backbone.js#L194

这意味着每次创建模型实例时,都会调用_.uniqueId()。 这是导致它增加两次的原因。