我在应用程序中使用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会被制造出邪恶并且负载很高。你知道你可以做到吗?
非常感谢大家!来自阿根廷的问候!
亚历
答案 0 :(得分:1)
你的解决方案很好,你只需要解除绑定并重新绑定事件,这应该不是问题。因为您使用相同的dom元素,所以必须再次渲染视图,但通常不会太重。我使用了相同的解决方案。
或者,您可以为MessagesView和EventsView提供单独的dom元素,在用户第一次进入路径时创建视图。然后,您始终隐藏并显示dom元素,具体取决于当前路线。