无法清除Backbone模型数组属性

时间:2014-09-18 13:58:47

标签: javascript backbone.js

我试图从Backbone模型中清除数据。查看jsfiddle here。 JS是:

    $(function(){
    //Define Model
    var loginData = Backbone.Model.extend({
            defaults: {
                token: null,
                data: []
            },

            initialize: function () {
            },

            /*
            * Push name/value to data array. If name is already present, overwrite value. Otherwise, push to end of data array
            */
            addToData: function (nameValue) {
                var data = this.get('data');

                var item, exists = false, index;
                for (var key in data) {
                    // The key is key
                    item = data[key];
                    if (item['name'] === nameValue.name) {
                        exists = true;
                        index = key;
                    }
                }
                if (exists) {
                    //overwrite value if name already in array
                    data[index].value = nameValue.value;
                } else {
                    //add to end of array if name not in array
                    data.push(nameValue);
                }
            },

            clearSensitiveData: function () {
                console.log('in clearSensitiveData');
                this.set('data', [], { silent: true });
                this.set('token', null, { silent: true });

            },
        });


    //Model View & event action
    var View = Backbone.View.extend({

        initialize: function() {
            this.model = new loginData();
        },
        addData: function(nameValue) {
            this.model.addToData(nameValue);
        },
        clear: function() {
            this.model.destroy();
        }

    });

    var view = new View;

    view.addData({'username':'abcd'});
    console.log('username of view is ');
    console.log(view.model.get('data')[0].username);

    view.model.clearSensitiveData();

    var view2 = new View;

    console.log('username of view2 is (this should fail because model should be cleared) ');
    console.log(view2.model.get('data')[0].username);



}());

如果你查看console.log输出,你会看到:

username of view is  (index):100
abcd (index):101
in clearSensitiveData (index):74
username of view2 is (this should fail because model should be cleared)  (index):107
abcd 

这很奇怪,因为clearSensitiveData()应该重置"数据"数组属性,但不知何故,模型仍然填充...

1 个答案:

答案 0 :(得分:3)

问题是您正在使用

defaults: {
  data: []
}

您将loginData的每个实例都提供对data数组的相同实例的访问权限。您不能在模型的defaults:中使用对象作为默认值,或者模型的每个实例都会引用相同的对象。

来自Backbone文档:

  

请记住,在JavaScript中,对象是通过引用传递的,因此如果将对象包含为默认值,则它将在所有实例之间共享。相反,将默认值定义为函数。

defaults定义为函数,或在initialize中手动初始化它:

defaults: {
  data: null
},

initialize: function () {
  this.set('data', []);
}

至于您的clearSensitiveData无法正常工作的原因,请记住,模型的所有实例在实例化后共享相同的data。您没有清除该共享阵列,您只需在第一个实例中使用新的[]覆盖它。 view2中的其他模型仍指向原始data数组,clearSensitiveData未对其进行任何修改。

您的clearSensitiveData函数很好,您只需要确保模型的每个实例都有自己的数据数组。