我有一个带有AppRouter的AMD Marionette应用程序 - AppRouter使用一个简单的控制器对象,其中包含一组用于应用程序中所有主要路径/操作的函数。
在视图中,在处理表单提交后,我想将用户移动到其他路径。
将用户发送到新路线的最佳方法是什么?我应该直接从视图中调用控制器中的方法(如果是这样我的控制器将是视图的依赖项)?我应该使用简单设置'window.location'吗?或者我应该使用EventAggregator吗?
如果我要在控制器中创建EventAggregator,我将如何在视图中触发这些事件?
我正在跟随Marionette wiki的'中央通风示例':
https://github.com/marionettejs/backbone.marionette/wiki/Using-marionette-with-requirejs
答案 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。