1

我正在使用主干模型,并且很惊讶地看到设置在我的主干模型的特定实例中的 JSON 对象和数组也可以被其他实例访问。

 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的键值对

  • m2 内的名称属性是默认值。(正如预期的那样)
  • exp : 与 m1 相同(不是预期的)
  • json:与 m1 中的相同(未预期)

JSBIN 演示

我无法解释这种行为。

更新

我想知道我应该如何解决它。我添加了一个答案(Kinda hacky),因为它对我有用,但我不知道它是否正确。也很想知道这种行为的原因。我做错了什么,或者这是 Backbone 中的某种错误。

4

1 回答 1

1

我曾经用一个 hack 来解决这个问题。在方法中重置所有用作 Backbone 模型中属性的对象和数组initialize

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);

JSBIN 的工作演示

于 2013-06-24T08:56:29.520 回答