【问题标题】:Backbone Model change data in one instance affects another一个实例中的主干模型更改数据会影响另一个实例
【发布时间】:2013-10-06 21:03:45
【问题描述】:

我在使用 Backbone.Model 时遇到了一个奇怪的错误

所以我的模型声明类似于:

var MyMode = Backbone.Model.extend({
   defaults:{
      'someList': []
   },

   initialize: function(){
      _.bindAll(this, 'toString', 'castFromString');
   },

   toString: function(){
      return this.get('hierarchyNameList').join('+');
   },

   castFromString: function(str){
      var strArray = [], index = 0;
      if (str) {
         strArray = str.split('+');
      }
      for (index = 0; index < strArray.length; index++){
         this.get('hierarchyNameList').push(strArray[index]);
      }
   }
});

然后我尝试测试它

(function () {
'use strict';

var assert = function(condition, message) {
    if (condition !== true) {
        throw message || "Assertion failed";
    }
};

var mA = new MyModel({'someList': ['a','b','c']});
var mB = new MyModel();
mB.castFromString('a+b+c');

//I have a added a equals function to array prototype and tested it
assert(mA.get('someList').equals(mB.get('someList')));     //true

var mC = new MyModel(mA.toJSON());    //behaves as expected
var mD = new MyModel();   //for some reason its list already contains the list from B
mD.castFromString(mB.toString());    //since castFromString used push, now B and D both has array of length 6

assert(mC.equals(mA));    //success
assert(mC.equals(mD));    //fail, mc has arrayLength 3, mD has 6


 }).call(this);

实际的代码比这更复杂,但我认为这可能是我做错了什么,关于为什么会发生这种情况的任何建议?提前致谢!

【问题讨论】:

    标签: backbone.js pass-by-reference javascript backbone-model


    【解决方案1】:

    问题在于您的默认设置

    defaults:{
      'someList': []
    },
    

    JavaScript 中的对象是通过引用而不是值传递的。这意味着您没有明确指定 someList 值的所有实例都将共享在上面的 defaults 定义中创建的数组。为避免这种情况,您可以将 defaults 定义为函数:

    defaults: function () {
        return { 'someList': [] };
    },
    

    这将为MyModel 的每个实例创建新数组,因此它们不会共享同一个数组。

    【讨论】:

    • 非常感谢!真的不知道 Backbone 模型中的默认值是如何工作的
    • 如果您不确定 Backbone 源代码是如何做某事的(尽管我不确定这对这个问题是否有帮助),那么浏览一下 Backbone 源代码是值得的。这是令人难以置信的有据可查且易于理解的文档。 github.com/jashkenas/backbone/blob/master/backbone.js
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多