无法清除主干模型数组属性
Cannot clear Backbone model array attribute
我正在尝试从主干模型中清除数据。在这里查看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
函数很好,只需要确保模型的每个实例都有自己的数据数组。
相关文章:
- 使用knockout.js将数组绑定到视图模型
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- 如何在ember数据模型中表示数组
- 在Backbone中对模型(数组)进行排序
- 主干输出用于集合模型的空数组
- 字符串映射的Extjs模型数组
- Angular2没有在模型数组中迭代
- Ember 数据模型数组并不总是有数据
- AngularJS 无法自定义验证模型数组值
- 如何在不破坏角度模型(数组)的情况下对其进行过滤
- 主干.js - 模型数组上的更改事件不会在元素更改时触发
- Backbone-JSON的模型数组
- 主干模型数组属性更改和更改事件侦听器不总是启动
- 如何创建对象的Mongoose模型数组
- 无法清除主干模型数组属性
- 如何将控制器's content属性设置为模型数组,而不需要相应的路由
- VueJS复选框模型数组的整数
- 主干:如何在添加模型数组时仅触发一次添加事件
- 筛选骨干集合将返回一个模型数组
- 如何将模型数组传递到jquery中