gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:39:18 27 4
gpt4 key购买 nike

使用 backbone.js,这是一个快速测试来演示我在使用嵌套模型时遇到的问题。

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

主页只有一个按钮,id=add。每次单击按钮时,都会向 ObjCollection 添加一个新的 Obj,并且 ObjView 会向页面添加一个按钮 (id=clickMe)。 clickMe 按钮绑定(bind)到一个 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;

});

加载了 jQuery 和 backbone 的 html 页面如下所示。

<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 的扩展方法会合并这两个对象。您可以在初始化方法中使用默认值声明非对象引用,并使用 myDefaults 声明对象引用。

关于javascript - backbone.js 模型指向嵌套模型的相同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com