Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法清除主干模型数组属性_Javascript_Backbone.js - Fatal编程技术网

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

Javascript 无法清除主干模型数组属性,javascript,backbone.js,Javascript,Backbone.js,我试图从主干模型中清除数据。查看jsfiddle。Th JS是: $(function(){ //Define Model var loginData = Backbone.Model.extend({ defaults: { token: null, data: [] }, initialize: function () {

我试图从主干模型中清除数据。查看jsfiddle。Th 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 

这很奇怪,因为clearsensitiedata()应该重置“data”数组属性,但不知何故,模型仍然填充…

问题在于您正在使用

defaults: {
  data: []
}
您正在为
loginda
的每个实例提供对
数据
数组的相同实例的访问权限。在模型的
默认值:
中,不能将对象用作默认值,或者模型的每个实例都引用同一对象

从主干文档:

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

默认值
定义为函数,或在
初始化
中手动初始化它:

defaults: {
  data: null
},

initialize: function () {
  this.set('data', []);
}
至于您的
clearSensitiveData
不起作用的原因,请记住,模型的所有实例在实例化后共享相同的
数据。您没有清除该共享阵列,只是在第一个实例中用一个新的
[]
覆盖它。
view2
中的另一个模型仍然指向原始的
数据
数组,该数组未被
clearSensitiveData
以任何方式修改


您的
clearSensitiveData
功能正常,只需确保模型的每个实例都有自己的数据数组。

问题在于您正在使用

defaults: {
  data: []
}
您正在为
loginda
的每个实例提供对
数据
数组的相同实例的访问权限。在模型的
默认值:
中,不能将对象用作默认值,或者模型的每个实例都引用同一对象

从主干文档:

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

默认值
定义为函数,或在
初始化
中手动初始化它:

defaults: {
  data: null
},

initialize: function () {
  this.set('data', []);
}
至于您的
clearSensitiveData
不起作用的原因,请记住,模型的所有实例在实例化后共享相同的
数据。您没有清除该共享阵列,只是在第一个实例中用一个新的
[]
覆盖它。
view2
中的另一个模型仍然指向原始的
数据
数组,该数组未被
clearSensitiveData
以任何方式修改


您的
clearSensitiveData
功能正常,只需确保模型的每个实例都有自己的数据数组。

问题在于您正在使用

defaults: {
  data: []
}
您正在为
loginda
的每个实例提供对
数据
数组的相同实例的访问权限。在模型的
默认值:
中,不能将对象用作默认值,或者模型的每个实例都引用同一对象

从主干文档:

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

默认值
定义为函数,或在
初始化
中手动初始化它:

defaults: {
  data: null
},

initialize: function () {
  this.set('data', []);
}
至于您的
clearSensitiveData
不起作用的原因,请记住,模型的所有实例在实例化后共享相同的
数据。您没有清除该共享阵列,只是在第一个实例中用一个新的
[]
覆盖它。
view2
中的另一个模型仍然指向原始的
数据
数组,该数组未被
clearSensitiveData
以任何方式修改


您的
clearSensitiveData
功能正常,只需确保模型的每个实例都有自己的数据数组。

问题在于您正在使用

defaults: {
  data: []
}
您正在为
loginda
的每个实例提供对
数据
数组的相同实例的访问权限。在模型的
默认值:
中,不能将对象用作默认值,或者模型的每个实例都引用同一对象

从主干文档:

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

默认值
定义为函数,或在
初始化
中手动初始化它:

defaults: {
  data: null
},

initialize: function () {
  this.set('data', []);
}
至于您的
clearSensitiveData
不起作用的原因,请记住,模型的所有实例在实例化后共享相同的
数据。您没有清除该共享阵列,只是在第一个实例中用一个新的
[]
覆盖它。
view2
中的另一个模型仍然指向原始的
数据
数组,该数组未被
clearSensitiveData
以任何方式修改

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