javascript - 主干删除和新 View 不会重置其属性数组内容

标签 javascript arrays backbone.js javascript-objects backbone-views

我在 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 = [];
    }
});

http://jsfiddle.net/nikoshr/67pr1gnk/1/

关于javascript - 主干删除和新 View 不会重置其属性数组内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32521724/

相关文章:

javascript - 仅向进入我网站的 20% 的人显示 div

python - Python 中的字符串处理

ruby-on-rails - 单击“后退”按钮时,直接从缓存中获得响应

javascript - appendChild 不起作用。 Javascript 新手

javascript - 在 IE 中打印隐藏的 iFrame

arrays - 非连续元素的最大和

javascript - 模型渲染内 View : toJSON is not a function

javascript - 如何在不实际点击的情况下手动触发主干点击事件

javascript - angular js中$scope的可变范围如何工作?

javascript - 如何继续检查数组直到满足特定条件