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