Marionette中的AppRouter,控制器和事件处理

时间:2013-08-30 11:34:23

标签: backbone.js marionette backbone-views backbone-events backbone-routing

我有一个带有AppRouter的AMD Marionette应用程序 - AppRouter使用一个简单的控制器对象,其中包含一组用于应用程序中所有主要路径/操作的函数。

在视图中,在处理表单提交后,我想将用户移动到其他路径。

将用户发送到新路线的最佳方法是什么?我应该直接从视图中调用控制器中的方法(如果是这样我的控制器将是视图的依赖项)?我应该使用简单设置'window.location'吗?或者我应该使用EventAggregator吗?

如果我要在控制器中创建EventAggregator,我将如何在视图中触发这些事件?


我正在跟随Marionette wiki的'中央通风示例':

https://github.com/marionettejs/backbone.marionette/wiki/Using-marionette-with-requirejs

2 个答案:

答案 0 :(得分:0)

我正在跟随Marionette wiki的'中央通风示例':

  

中央通风口示例

     

在任何地方都要求你的应用程序可能很乏味而且有   通常更好的方案。如果你发现自己这么做了很多   通风口,你可能最好做一个独立的模块来行动   作为中央应用程序发泄。用更少的更小的模块制作   依赖关系通常是围绕AMD问题的解决方案   循环依赖。

     

通风口模块定义

     

与牵线木偶版本< 1.0.0-RC4

// vent.js
define(['marionette'],function(marionette){
  return new Marionette.EventAggregator();
})
     

使用牵线木偶版本> = 1.0.0-rc4

// vent.js

define(['backbone.wreqr'],function(Wreqr){
  return new Wreqr.EventAggregator();
})
     

<强>用法

     

现在你有一个没有明确依赖的'全局'通风口模块   您的申请,可以依赖于任何地方。

define(['vent'], function(vent) {
      vent.on('eventName', function(){});
      vent.trigger('eventName');
    })

https://github.com/marionettejs/backbone.marionette/wiki/Using-marionette-with-requirejs

答案 1 :(得分:0)

我如何为自己的目的解决这个问题如下(YMMD,请原谅CoffeeScript):

# Controller:
class MyController extends Backbone.Marionette.Controller
  showView: () ->
    view = new MyView()
    @listenTo view, 'show:otherview', @showOtherView
    @show(view)
  showOtherView: (href) ->
    otherView = new MyOtherView()
    @show(otherView)

 # View:
 class MyView extends Backbone.Marionette.ItemView
   events:
     'click a': 'emitShow'
   emitShow: (event) ->
     event.preventDefault()
     event.stopPropagation()
     href = @$(event.currentTarget).attr('href')
     @trigger('show:otherview', href)

当然href只是您可能希望从视图中获取的一些数据的示例,以作为参数传递到事件处理程序中。这可以是任何东西,或者如果不必要可以省略。这完全绕过了路由器,因此控制器可以在适当的时候调用Backbone.navigate(没有trigger:true)来更新浏览器URL。