Модели backbone.js, указывающие на один и тот же экземпляр вложенной модели - PullRequest
7 голосов
/ 15 июня 2011

Используя backbone.js, вот быстрый тест, чтобы продемонстрировать проблему, с которой я сталкиваюсь вложенных моделей .

Предисловие У меня есть модель Obj, которая содержит2 вложенные модели, Obj1 и Obj2.Сама модель Obj имеет View (ObjView), и есть View для самой главной страницы (BodyView).

На главной странице есть одна кнопка, id = add.При каждом нажатии кнопки новый объект Obj добавляется в коллекцию ObjCollection, а ObjView добавляет кнопку (id = clickMe) на страницу.Кнопка clickMe связана с testFunc, который 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>

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

fortuneRice, когда инициализируется модель Backbone, super.constructor перемещает значения по умолчанию во внутренний массив атрибутов, где model.get ищет «obj1».Пример Prusse инициализирует значения obj1 и obj2 новыми объектами для каждого экземпляра, но не перемещает значения во внутренний массив атрибутов.Вот моя модификация решения Прусса.

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

Метод расширения jQuery объединит два объекта.Вы можете объявить ссылки на необъектные значения по умолчанию, а ссылки на объекты - myDefaults в методе initialize.

3 голосов
/ 15 июня 2011

С:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...