2012-03-14 81 views
0

在应用程序中使用backbone,require.js和coffeescript。编程我的应用程序,发现我对视图有问题。对不起我的英语不好 ! =)主干在同一负载视图上触发许多事件

我的DOM是:

<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' 

我有以下问题:

当我实例,并在路由器调用(“消息“)messagesView,我做了一个抓取,渲染工作正常。然后,当路由器导航到其他路线(“事件”)并调用eventsView时,同样的事情发生,它正确地呈现视图。

但是,如果再次导航路线“消息”事件“测试”被激发两次! ,每个实例一次!我发现如果我打电话给路由器$(“#容器”)。unbind()以前的实例MessagesView,这解决了这个问题,但我不知道我的解决方案,它真的很不错。

我的恐惧是DOM正在创造邪恶和高负载。你知道你可以用这个吗?

非常感谢大家!来自阿根廷的贪婪!

亚历

回答

1

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

或者,您可以为MessagesView和EventsView单独使用dom元素,在用户首次前往路线时创建视图。然后,您总是根据当前路线隐藏并显示dom元素。

+0

非常感谢!太好了! =) – AleVasta 2012-03-14 19:25:07