我正在使用主干模型,并且非常惊讶地发现我的JSON对象和设置在我的Backbone模型的特定实例中的数组也可以被其他实例访问。
var myModel = Backbone.Model.extend({
defaults: {
exp: [],
name: '',
json: { }
},
getExp: function() {
return this.get('exp');
},
getJSON: function() {
return this.get('json');
}
});
var m1 = new myModel();
var experiences = m1.getExp();
experiences.push('arrayitem1');
experiences.push('arrayitem2'); //Setting values for array of m1
m1.set('name', 'my name');
var json = m1.getJSON();
json.key = 'somevalue';
var m2 = new myModel();
console.log(m1.attributes);
console.log(m2.attributes);
输出:
{"exp": ["arrayitem1", "arrayitem2"], "json": {"key": "somevalue"}, "name": "my name"}
{"exp": ["arrayitem1", "arrayitem2"], "json": {"key": "somevalue"}, "name": ""}
m2的键值对
我无法解释这种行为。
更新
我想知道我该如何解决它。我已经添加了一个答案(Kinda hacky),因为它对我有用,但我不知道它是否正确。很想知道这种行为的原因。我做错了什么或者这是Backbone中的某种错误。
答案 0 :(得分:1)
有一个我用来解决这个问题的黑客攻击。在initialize
方法中重置Backbone模型中用作属性的所有对象和数组。
var myModel = Backbone.Model.extend({
defaults: {
exp: [],
name: '',
json: { }
},
getExp: function() {
return this.get('exp');
},
getJSON: function() {
return this.get('json');
},
initialize: function() {
this.set('exp', []);
this.set('json', {});
}
});
var m1 = new myModel();
var experiences = m1.getExp();
experiences.push('arrayitem1');
experiences.push('arrayitem2');
m1.set('name', 'my name');
var json = m1.getJSON();
json.key = 'somevalue';
var m2 = new myModel();
console.log(m1.attributes);
console.log(m2.attributes);