在同一个加载视图上激活很多事件

时间:2012-03-14 15:39:50

标签: events backbone.js views

我在应用程序中使用backbone,require.js和coffeescript。编程我的应用程序,发现我的视图有问题。对不起我的英语不好 ! =)

我的主意是:

<div id="header"></div>
<div id="container"></div>

我的应用程序的一部分:

class AppRouter extends Backbone.Router
     routes:
        '': 'home'
        'u/:user': 'user'
        'events: 'events'
        'messages': 'messages'

    events: () ->
        events = new EventsView
        events.events()
    messages: () ->
        messages = new MessagesView
        messages.messages()

class MessagesView extends Backbone.View 
    template: window.Handlebars.compile MessagesTpl
    el : '#container'
    events :
        'click #test' : 'test'

    test: () ->
         console.log 'test'

    messages: () ->
         #fecth and bind render method on 'all'

class EventsView extends Backbone.View
    template: window.Handlebars.compile EventsTpl
    el : '#container'

    events: () ->
         #fetch and bind render method on 'all'

我有以下问题:

当我在路由器(“messages”)中实例并调用messagesView时,我会进行提取并且渲染工作正常。然后,当路由器导航到其他路由(“事件”)并调用eventsView时,会发生同样的事情,它会正确呈现视图。

但是如果再次在路线“消息”上导航,事件“test”会被触发两次! ,每个实例一次!

我发现如果我在路由器上调用$(“#container”)。unbind()之前的实例MessagesView,这解决了问题,但我不知道我的解决方案是否真的很好。

我担心DOM会被制造出邪恶并且负载很高。你知道你可以做到吗?

非常感谢大家!来自阿根廷的问候!

亚历

1 个答案:

答案 0 :(得分:1)

你的解决方案很好,你只需要解除绑定并重新绑定事件,这应该不是问题。因为您使用相同的dom元素,所以必须再次渲染视图,但通常不会太重。我使用了相同的解决方案。

或者,您可以为MessagesView和EventsView提供单独的dom元素,在用户第一次进入路径时创建视图。然后,您始终隐藏并显示dom元素,具体取决于当前路线。