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 内の Name プロパティはデフォルトです。(予想通り)
  • exp : m1 と同じ (想定外)
  • json: m1 と同じ (想定外)

JSBINデモ

この行動の理由を説明することはできません。

アップデート

どうすれば解決できるのか知りたいです。それは私のために働いているので、私は答え(ちょっとハック)を追加しましたが、それが正しいかどうかはわかりません。この動作の理由も知りたいです。私は何をしているのですか、それともこれは Backbone の何らかのバグですか?

4

1 に答える 1

1

この問題を解決するために使用したハックがあります。メソッドのバックボーン モデルで属性として使用されるすべてのオブジェクトと配列をリセットします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 に答える