【发布时间】:2015-02-23 17:18:15
【问题描述】:
我正在实现一个应用程序,它在顶级应用程序模块中有两个独立的子模块。
我有一个管理模块,其路由约定以/admin 开头,用户模块的路由以/user 开头。顶级应用程序定义了一个rootRoute,因此当您导航到http://url/ 时,您将根据权限重定向到管理员或用户页面。我想了解的是是否可以根据路线启动和停止特定模块。这是我的意思的一个例子:
假设我有一个顶级应用程序(在 coffeescript 中)
@ClientApp = do (Backbone, Marionette) ->
App = new Marionette.Application
navigate: (route, options = {}) ->
Backbone.history.navigate route, options
App.on "start", (options) ->
if Backbone.history
Backbone.history.start()
App.on "stop", ->
App.module("AdminApp").stop()
App.module("UserApp").stop()
class App.Router extends Marionette.AppRouter
initialize: (options) ->
@route /^admin(.*)/, 'startAdminApp', options.controller.startAdminApp
@route /^user(.*)/, 'startUserApp', options.controller.startUserApp
appRoutes:
"": "redirectToRoot"
App.addInitializer ->
new App.Router
controller: API
API =
redirectToRoot: ->
# some redirect logic that will lead you to either /admin or /user
startAdminApp: ->
App.mainRegion.show new App.Layouts.Admin
App.module("AdminApp").start()
startUserApp: ->
App.mainRegion.show new App.Layouts.User
App.module("UserApp").start()
App
在管理和用户子模块中我也定义了路由
@ClientApp.module "AdminApp.DashboardApp", (DashboardApp, App, Backbone, Marionette, $, _) ->
_.extend DashboardApp, Backbone.Wreqr.radio.channel("dashboard")
class DashboardApp.Router extends Marionette.AppRouter
appRoutes:
"admin/dashboard": "statistics"
API =
getLayout: ->
new DashboardApp.Layout.View
statistics: ->
DashboardApp.StatisticsAp.start()
DashboardApp.on "start", ->
@layout = API.getLayout().render()
API.statistics()
App.addInitializer ->
new DashboardApp.Router
controller: API
如果我导航到/,应用程序按预期工作,我将被重定向到必要的命名空间并启动特定的子模块。但是,如果我在子模块中定义一些其他路由,它们似乎会覆盖现有的正则表达式匹配器。因此,如果我打开浏览器并导航到/admin/statistics,它将不会启动管理应用程序并且/admin/statistics 的回调将失败并出现错误。那是因为管理应用程序不会启动并且 mainRegion 没有填充相应的布局。请注意,在任何子模块之前都需要包含顶级应用程序定义的文件(我猜这就是路由被覆盖的原因)。我也知道骨干路由器会在遇到第一个匹配时调用路由回调。
所以问题是是否有可能实现一种路由管理器,它将使用正则表达式检查当前路由并启动或停止相应的应用程序(管理员或用户),所有已定义的子路由都是持久且可收藏的?
【问题讨论】:
标签: javascript backbone.js coffeescript routing marionette