Javascript 无法清除主干模型数组属性
我试图从主干模型中清除数据。查看jsfiddle。Th JS是:Javascript 无法清除主干模型数组属性,javascript,backbone.js,Javascript,Backbone.js,我试图从主干模型中清除数据。查看jsfiddle。Th JS是: $(function(){ //Define Model var loginData = Backbone.Model.extend({ defaults: { token: null, data: [] }, initialize: function () {
$(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
函数很好,只需确保模型的每个实例都有自己的数据数组