【问题标题】:Backbone - Instantiated view has old dataBackbone - 实例化视图具有旧数据
【发布时间】:2013-10-31 11:20:44
【问题描述】:

我有以下视图类:

define(function(require) {
    var Backbone = require('backbone');

    var TestView = Backbone.View.extend({
        el: $("#test"),
        test: new Array(),

        initialize: function(){
            this.test.push("test");
            console.log(this.test);
        }
    });

    return TestView
});

当我实例化视图时,像这样:

var v = new TestView();

测试数组每次递增一,而不是在每个实例上为空。我已采取措施删除僵尸视图(遵循此 URL 中的步骤:http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/),但该数组仍保留每个新实例的旧数据。

显然我可以删除初始化函数中的数据,但我很好奇为什么这些数据会保留在本质上是一个全新的视图对象中?好像是一些垃圾收集问题?

【问题讨论】:

  • 如果你设置test: []而不是new Array()呢?
  • 不幸的是同样的交易:(
  • 你能展示你在哪里进行测试的全部相关代码吗?

标签: javascript backbone.js


【解决方案1】:

你的new Array()调用只在你创建TestView原型的时候进行,你需要在实际创建对象时创建,否则TestView的所有实例之间共享,

initialize: function(){
    this.test = new Array();
    this.test.push("test");
    console.log(this.test);
}

如果我这样做,您的el: $("#test") 电话也会发生同样的事情,

var v = new TestView();
$("#test").detach();
var v2 = new TestView();
v.el == v2.el // true

所以要完成你想要的,

define(function(require) {
    var Backbone = require('backbone');

    var TestView = Backbone.View.extend({
        initialize: function(){
            this.test = new Array();
            this.test.push("test");
            console.log(this.test);
        }
    });

    return TestView
});

var v = new TestView({ el : '#test'});

【讨论】:

  • 在这种情况下很烦人,但在另一种情况下可能真的很方便!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2016-08-06
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多