Backbone 删除和新视图不会重置其属性数组内容
Backbone remove and new view does not reset its attribute array content
我对 Backbone 的看法具有以下两个属性:
var MyBasketView = Backbone.View.extend({
_totalCost: 0,
_devices: [],
在初始化时,我通过 localStorage 中的一个数组和几个设备将它们推送到 _devices 数组并将它们的总和加到 _totalCost,就像这样
var self = this;
_.each(this._cartItems, function(cartItem) {
self._totalCost += cartItem.item.cost;
self._devices.push(cartItem.item);
}
在我的路由器中,当我离开这个页面时我删除了这个视图,当我回来时我又创建了这个视图。问题是,当我在初始化函数中打印属性时,总成本为 0,并且设备数组仍然包含之前的设备。
当我删除视图或使用新的 MyBasketView() 创建它时,它不应该被重置吗?
我当然可以在初始化时清理它,但我想了解为什么会发生这种情况以及其他对象是否也会发生这种情况?
解释与 Model.defaults
(细则)基本相同:
Remember that in JavaScript, objects are passed by reference, so if
you include an object as a default value, it will be shared among all
instances.
当您创建视图的新实例时,值会被复制,包括 _devices
将指向相同的数组引用:
var v1 = new MyBasketView();
var v2 = new MyBasketView();
v1._devices === v2._devices // true
http://jsfiddle.net/nikoshr/67pr1gnk/
并且该数组的内容会在您的 MyBasketView
原型的整个生命周期中保留(即使实例被销毁)。
最简单的修复方法是在 initialize
函数中分配变量:
var MyBasketView = Backbone.View.extend({
_totalCost: 0,
initialize: function() {
this._devices = [];
}
});
这似乎是 Backbone 的工作原理。您传递的对象不是深度克隆的。在 initialize
中设置非常量变量可能是更好的做法。
我对 Backbone 的看法具有以下两个属性:
var MyBasketView = Backbone.View.extend({
_totalCost: 0,
_devices: [],
在初始化时,我通过 localStorage 中的一个数组和几个设备将它们推送到 _devices 数组并将它们的总和加到 _totalCost,就像这样
var self = this;
_.each(this._cartItems, function(cartItem) {
self._totalCost += cartItem.item.cost;
self._devices.push(cartItem.item);
}
在我的路由器中,当我离开这个页面时我删除了这个视图,当我回来时我又创建了这个视图。问题是,当我在初始化函数中打印属性时,总成本为 0,并且设备数组仍然包含之前的设备。
当我删除视图或使用新的 MyBasketView() 创建它时,它不应该被重置吗?
我当然可以在初始化时清理它,但我想了解为什么会发生这种情况以及其他对象是否也会发生这种情况?
解释与 Model.defaults
(细则)基本相同:
Remember that in JavaScript, objects are passed by reference, so if you include an object as a default value, it will be shared among all instances.
当您创建视图的新实例时,值会被复制,包括 _devices
将指向相同的数组引用:
var v1 = new MyBasketView();
var v2 = new MyBasketView();
v1._devices === v2._devices // true
http://jsfiddle.net/nikoshr/67pr1gnk/
并且该数组的内容会在您的 MyBasketView
原型的整个生命周期中保留(即使实例被销毁)。
最简单的修复方法是在 initialize
函数中分配变量:
var MyBasketView = Backbone.View.extend({
_totalCost: 0,
initialize: function() {
this._devices = [];
}
});
这似乎是 Backbone 的工作原理。您传递的对象不是深度克隆的。在 initialize
中设置非常量变量可能是更好的做法。