我试图从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()应该重置"数据"数组属性,但不知何故,模型仍然填充...
答案 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
函数很好,您只需要确保模型的每个实例都有自己的数据数组。