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

时间:2014-08-26 20:18:47

标签: javascript backbone.js instantiation router

我注意到当我多次更改网址时,我的应用程序开始变得迟钝。我怀疑这是因为我设置的路由是每次访问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});
});

所以在这个简单的例子中,如果我在链接<a href="#"><a href="#helloworld">上单击返回和第四个,那么是否会建立视图和模型对象?如果是这样,那将是一个问题。我会想象记忆会被吃掉,但我可能只是没有正确地理解事物。

以下是我点击两个路线之间的第四个时间轴的截图。似乎有一个听众的积累,我猜测它来自我在其中一个特定视图上设置的事件监听器。我认为它是在每个实例化上创建新的监听器。

enter image description here

1 个答案:

答案 0 :(得分:4)

我认为你正在制作&#34; zombie&#34;观点。创建像:

这样的视图时会发生这种情况
new someOtherView({model : thing});

可能包含对DOM元素的事件绑定。下次再次点击同一路径时,您只需使用新绑定创建另一个视图,而无需取消绑定上一个视图的事件。

Derick Bailey写了一篇很棒的文章:

http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

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

我的骨干视图通常采用close方法:

close: function () {
    this.model.stopListening();
    // unbind other stuff
}

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

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});
 });