1

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

在一个视图中,处理表单提交后,我想将用户移动到不同的路线。

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

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


我正在关注 Marionette wiki 中的“中央通风口示例”:

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

4

2 回答 2

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

于 2013-08-30T11:45:59.937 回答
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。

于 2013-10-05T21:03:41.767 回答