模态的骨干路由器

时间:2012-09-09 06:10:56

标签: backbone.js coffeescript

我有一个非常基本的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: ->
    # ?

这很好用,但我不知道如何处理窗口历史记录和用户选择后退按钮(即如何在点击后面拆除模态)。有没有人对最佳方法有任何想法?谢谢。

1 个答案:

答案 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/renderclose的“类”。因此应用程序负责清理它。

现在有时我在主应用程序中有模态或“子应用程序”。我使用了上述的变体,并在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/