骨干移除和新视图不会重置其属性数组内容

Backbone remove and new view does not reset its attribute array content

本文关键字:属性 数组 新视图      更新时间:2023-09-26

我有一个关于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(小字)基本相同:

记住,在JavaScript中,对象是通过引用传递的,所以如果您将一个对象作为默认值包含,它将被所有人共享实例。

当您创建视图的新实例时,值被复制,包括指向相同数组引用的_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 = [];
    }
});
http://jsfiddle.net/nikoshr/67pr1gnk/1/

这似乎就是Backbone的工作原理。您传递的对象不是深度克隆的。在initialize中设置非const变量可能是一个更好的做法。

请看:http://jsfiddle.net/jrbxnr0t/