我在 Backbone 上有一个 View ,具有这两个属性:
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);
}
在我的路由器中,当我离开这个页面时我会删除这个 View ,当我回来时我会再次创建这个 View 。问题是,当我在初始化函数中打印属性时,总成本为 0,并且设备数组仍然包含之前的设备。
当我删除 View 或使用新的 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.
当您创建 View 的新实例时,将复制值,包括将指向相同数组引用的 _devices
:
var v1 = new MyBasketView();
var v2 = new MyBasketView();
v1._devices === v2._devices // true
http://jsfiddle.net/nikoshr/67pr1gnk/
并且该数组的内容在您的 MyBasketView
原型(prototype)的整个生命周期中都会保留(即使实例被销毁)。
最简单的修复方法是在 initialize
函数中分配变量:
var MyBasketView = Backbone.View.extend({
_totalCost: 0,
initialize: function() {
this._devices = [];
}
});
关于javascript - 主干删除和新 View 不会重置其属性数组内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32521724/