我有一个非常基本的Backbone JS应用程序,它有模态。目前,我的路由器提供如下模式:
class App.Routers.Router extends Backbone.Router
routes:
"modal" : "modal"
modal: ->
view = new App.Views.Modal.New()
$('#shared').html(view.el)
view.render()
view.show()
return
class App.Views.Sessions.New extends Backbone.View
template: Handlebars.templates["backbone/templates/modals"]
initialize: (options) ->
super(options)
render: ->
$(@el).html(@template())
$('.modal', @el).modal()
$('.modal', @el).on 'hidden', @cleanup
return @
show: ->
$('.modal', @el).modal('show')
hide: ->
$('.modal', @el).modal('hide')
cleanup: ->
# ?
这很好用,但我不知道如何处理窗口历史记录和用户选择后退按钮(即如何在点击后面拆除模态)。有没有人对最佳方法有任何想法?谢谢。
答案 0 :(得分:4)
您偶然发现单页应用(SPA)存在一个有趣的问题。是的,它可能会有点棘手,但简单的软件工程原理/设计可以在这里提供帮助。我已通过以下方式处理清理工作:
有一个单独的类/对象负责管理应用程序的各个“部分”之间的视图转换。例如,在我的应用程序中,我有这样的东西:
var App = {};
//when showing a specific app:
App.showView = function(appToShow){
if(this.currentApp)
currentApp.close();
this.currentApp = appToShow;
//render appToShow;
}
appToShow
是一个包含方法create/render
和close
的“类”。因此应用程序负责清理它。
现在有时我在主应用程序中有模态或“子应用程序”。我使用了上述的变体,并在close
对象中添加了App
方法。但基本的想法是将这些“子应用”添加为主应用的属性:
//when creating modal:
App.addModal = function(modal){
this.currentApp.modal = modal;
}
现在,当通过单击后退按钮或应用程序的其他部分进行转换时,您必须调用App
- 经理来处理清理和转换。这基本上就像是说:
App.closeModal = function(modal){
if(this.currentApp.modal)
this.currentApp.modal.close();
}
根据路由器的组织方式,您应该能够决定是完全关闭整个应用还是仅关闭模式/子应用。基本上你的“应用程序管理器”是一个单独的对象,只负责处理视图之间的转换,不需要是Backbone.View
- 一个单独的对象可以正常工作。您甚至可以通过创建和事件聚合器使用Backbone的事件来监听事件。 Derick Bailey撰写了一篇精彩的博客文章,详细说明了这一点:http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/