0

我目前正在使用ES6和Marionette v3重写我们的木偶代码库。最好能够在不违反德米特法的情况下处理人偶模块之间的通信

我创建了几个子模块(ProductShowRoute,CartManager等),这些都是从我的主App开始的。

我想知道你们是如何管理模块之间的通信。在我们之前的Marionette应用程序中,通讯过于繁忙,并且使用Backbone.Wreqr发送太多内容。

当用户将产品添加到购物车时,我们的ProductsModule需要让CartModule知道这一点。如何在不写太多意大利面代码的情况下组织这种沟通? Backbone.Radio/Backbone.Wreqr是很好的工具,但是如果使用不正确(或模块之间发生太多事情),很难知道哪些事件最终在哪里结束。

此外,我想知道你是如何改变路线。我读了一篇Derick Bailey的博客文章,他警告使用App.navigate(‘route’, { trigger: true }),但在Marionette Wires中我看到这发生了几次。 trigger: true真的这不好用吗?我们有什么替代方案?之前我们使用了Backbone.Wreqr,它调用了每个模块的Router并且改变了路线,但是这看起来像很多来回的通信。

非常感谢!

弗农

回答

0

对于subApps之间的通信,我喜欢每subApp触发的方法在其频道指示它们的动作,则有一个事件注册表某处在App。我喜欢这样做,这样我可以清楚地看到事件发生时的一系列操作。另外,在我看来,这不应该是ProductsModules关注的事件被触发

// Fire an event. 
ProductsModuleChannel.trigger('product:added', productModel); 

// Event Registry 
App.listenTo(ProductModuleChannel, 'product:added', function (productModel) { 
    CartManager.addProduct(productModel) 
}) 

后在问候App.navigate('route', {trigger: true});会发生什么,我不喜欢的应用是“驱动的路线”。路线应该是应用程序的入口点,但那就是它。我倾向于这样做以下

... 
showSomePage: function() { 
    // Render some views and do other things 

    // Update the route 
    App.navigate('myRoute'); // Note no 'trigger: true' 
} 

希望这有助于

相关问题