无法清除主干模型数组属性

Cannot clear Backbone model array attribute

本文关键字:模型 数组 属性 清除      更新时间:2023-09-26

我正在尝试从主干模型中清除数据。在这里查看jsfiddle。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()应该重置"data"数组属性,但不知何故,模型仍然被填充。。。

问题是您正在使用

defaults: {
  data: []
}

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

来自主干文档:

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

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

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

至于为什么clearSensitiveData不起作用,请记住,模型的所有实例在实例化后都共享相同的data。您不是在清除共享数组,而是在第一个实例中用新的[]覆盖它。view2中的另一个模型仍然指向原始的data阵列,该阵列没有被clearSensitiveData以任何方式修改。

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