backbone.js模型指向嵌套模型的相同实例

使用backbone.js,这里是一个快速测试,用于演示我面临的嵌套模型问题

前言我有一个Obj模型,它包含2个嵌套模型Obj1和Obj2。 Obj模型本身有一个View(ObjView),并且主页面本身有一个View(BodyView)。

主页面有一个按钮,id = add。 每次按钮被点击时,一个新的Obj被添加到ObjCollection中,并且ObjView将一个按钮(id = clickMe)添加到页面中。 clickMe按钮绑定到一个test.Func,它的console.logs this.model和this.model.get(“obj1”)。

问题通过检查console.logs,我发现虽然每个Obj都是一个新实例,但它们的嵌套Obj1指向的是obj1!的同一个实例! 但是Obj的每个实例显然都应该有自己的嵌套模型obj1和obj2的实例。

任何帮助赞赏。

$(document).ready(function(){

    var Obj1 = Backbone.Model.extend({
        defaults:{
            Attr1A   : false,
            Attr1B   : false
        }
    })

    var Obj2 = Backbone.Model.extend({
        defaults:{
            Attr2A   : false,
            Attr2B   : false
        }
    })

    var Obj = Backbone.Model.extend({
        defaults: {
            obj1    : new Obj1(),
            obj2    : new Obj2()
        }
    })

    var ObjCollection = Backbone.Collection.extend({
        model: Obj
    });


    var ObjView = Backbone.View.extend({

        initialize: function(){
            _.bindAll(this, 'render', 'testFunc');
            this.model.bind('change', this.render);
            this.model.view = this;

            $("body").append(this.render().el);
        },

        events: {
            "click #clickMe" : "testFunc"
        },

        render: function(){
            $(this.el).html('<input type ="button" id="clickMe" value="Click">')
            return this;
        },

        testFunc: function(){
            console.log(this.model); //returns Obj models with unique cids
            console.log(this.model.get("obj1")); //returns Obj1 models with the SAME cid!
        }
    });


    var BodyView = Backbone.View.extend({
        el: $('body'),

        events:{
            "click #add"  : "addObj"
        },

        initialize: function(){
            _.bindAll(this, 'render', 'addObj')
            this.collection = new ObjCollection();
            this.collection.bind('add', this.appendObj); 
        },

        addObj: function(){
            var myObj = new Obj();
            this.collection.add(myObj);
        },

        appendObj: function(myObj){
            var objView = new ObjView({
                model: myObj
            });
        }
    });
    var bodyView = new BodyView;

});

html页面仅包含jQuery和主干加载的以下内容。

<body>
    <input type ="button" id="add" value="Add">
</body>

fortuneRice,当Backbone模型被初始化时,super.constructor将默认值移动到内部属性数组,其中model.get查找“obj1”。 Prusse的示例使用每个实例的新对象初始化obj1和obj2值,但不会将值移至内部属性数组。 这是我对Prusse解决方案的修改。

var Obj = Backbone.Model.extend({
    initialize: function() {
        myDefaults = {
            obj1: new Obj1();
            obj2: new Obj2();
        }
        this.set(myDefaults);
});

jQuery的扩展方法将结合这两个对象。 您可以在initialize方法中声明具有默认值的非对象引用和带有myDefaults的对象引用。


附:

var Obj = Backbone.Model.extend({
    defaults: {
        obj1    : new Obj1(),
        obj2    : new Obj2()
    }
})

你说你想让所有使用“Obj”创建的对象具有相同的“obj1”和“obj2”值,请使用:

var Obj = Backbone.Model.extend({
    initialize: function() {
        this.obj1 = new Obj1();
        this.obj2 = new Obj2();
    }
});

达到你所看到的目标。 http://documentcloud.github.com/backbone/#Model-constructor

链接地址: http://www.djcxy.com/p/83127.html

上一篇: backbone.js models pointing to same instance of nested model

下一篇: How big are Javascript function objects?