Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我在backbone.js路由中实例化的对象太多了吗?_Javascript_Backbone.js_Instantiation_Router - Fatal编程技术网

Javascript 我在backbone.js路由中实例化的对象太多了吗?

Javascript 我在backbone.js路由中实例化的对象太多了吗?,javascript,backbone.js,instantiation,router,Javascript,Backbone.js,Instantiation,Router,我注意到,当我多次更改URL时,我的应用程序开始变得迟钝。我怀疑这是因为我设置的路由在每次访问url时都会实例化一个新视图,不确定是否有其他方法可以实现这一点。这可能是因为我对javascript理解不够。当我实例化的视图不再被使用后,或者换句话说,当我访问一条新路线时,它们会发生什么情况 var Router = Backbone.Router.extend({ routes: { '':'doSomething', 'helloworld':'doSo

我注意到,当我多次更改URL时,我的应用程序开始变得迟钝。我怀疑这是因为我设置的路由在每次访问url时都会实例化一个新视图,不确定是否有其他方法可以实现这一点。这可能是因为我对javascript理解不够。当我实例化的视图不再被使用后,或者换句话说,当我访问一条新路线时,它们会发生什么情况

var Router = Backbone.Router.extend({
    routes: {
        '':'doSomething',
        'helloworld':'doSomethingElse'
    }
});

var app_router = new Router;

app_router.on('route:doSomething', function() {
    var thing = new SomeModel();
    new someView({model : thing});
});

app_router.on('route:doSomethingElse', function() {
    var thing = new SomeModel();
    new someOtherView({model : thing});
});
所以在这个简单的例子中,如果我在链接上单击“上一步”和“第四步”,是否会生成视图和模型对象?如果是这样的话,这会是一个问题。我会想象记忆会被吞噬,但我可能只是没有正确地理解事物

这是我在两条路线之间单击后退和第四条路线时的时间线截图。似乎有一个听众群,我猜是来自我在某个特定视图上设置的事件听众。我认为这是在每个实例化上创建新的侦听器


我认为你在制造僵尸视图。当您创建以下视图时会发生这种情况:

new someOtherView({model : thing});
它可能包含到DOM元素的事件绑定。下次当您再次点击同一路线时,只需创建另一个视图,使用新绑定,而不解除前一个视图的事件绑定

德里克·贝利(Derick Bailey)就此写了一篇很棒的文章:

为了简化,您必须在视图中实现一个关闭机制,并在创建新的视图之前关闭它们,解除已注册事件的绑定

我的主干视图通常有一个封闭的方法:

虽然我的路由器始终保留对以前创建的视图的引用:

app_router.on('route:doSomething', function(id) {
    var thing = new SomeModel();
    if (this.currentSomeView) {
        this.currentSomeView.close(); // this will unbind the previously registered events
    }
    this.currentSomeView = new someView({model : thing});
 });

你在泄漏内存吗?您是否检查了浏览器的开发工具?主干网是否提供了卸载视图的方法?像ExtJS那样?我想不是,这听起来可能是个问题,因为我在其中一个视图中确实有一些绑定到DOM元素的事件。我用自己代码中的一个示例扩展了我的答案。是的,如果你没有像我一样实现自己的close方法。请看我的答案。正如我已经说过的,这是我代码中的一个示例,我从不从我的页面中删除DOM元素,只是重新呈现它们,这就是我从不调用remove的原因。我只是给了他一个想法,他应该朝哪个方向走。
app_router.on('route:doSomething', function(id) {
    var thing = new SomeModel();
    if (this.currentSomeView) {
        this.currentSomeView.close(); // this will unbind the previously registered events
    }
    this.currentSomeView = new someView({model : thing});
 });