使用backbone.js,這裏是一個快速測試,用於演示我面臨的問題嵌套模型。backbone.js模型指向嵌套模型的相同實例
前言 我有一個包含2個嵌套模型,OBJ1和OBJ2一個的OBJ模型。 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 2011-06-15 22:04:47
爲什麼不使用'this.set(myDefaults)'而不是'$()。extend(...)'?在內部它做同樣的事情,並會有相同的效果,但我相信使用set是更清潔。 – idbentley 2011-06-16 00:30:28
@idbentley哦,我想你可以做到這一點!沒有想到它,但是,它會更乾淨。你可以使用set觸發change事件,但是你可以使用silent選項,所以我想這真的沒有關係。 – c3rin 2011-06-30 19:58:51