0

Je travaille actuellement sur la réécriture de notre base de code Marionette en utilisant ES6 et Marionette v3.Meilleur pour gérer la communication entre les modules Marionette sans violer la loi de Demeter

J'ai créé un couple de sous-modules (ProductShowRoute, CartManager, etc.) qui sont tous démarrés depuis mon App principal.

Je me demandais comment vous gérez la communication entre les modules. Dans nos précédentes applications Marionette, la communication était trop mouvementée et trop était envoyé en utilisant Backbone.Wreqr.

Lorsqu'un utilisateur ajoute un produit à son panier, notre ProductsModule doit en informer le CartModule. Comment organisez-vous cette communication sans écrire trop de code spaghetti? /Backbone.Wreqr sont d'excellents outils, mais lorsqu'ils sont utilisés de manière incorrecte (ou trop de choses se produisent entre les modules), il est difficile de savoir quels événements se terminent où.

Aussi, je me demande comment vous changez de route. J'ai lu un billet de Derick Bailey qui a mis en garde contre l'utilisation de App.navigate(‘route’, { trigger: true }) mais dans Marionette Wires j'ai vu cela se produire à quelques reprises. Est-ce vraiment trigger: true ce mauvais à utiliser? Et quelles alternatives avons-nous? Nous avons utilisé Backbone.Wreqr pour cela avant, ce qui appelle le Router de chaque module et change l'itinéraire, mais cela semble beaucoup de communication en va-et-vient.

Merci beaucoup!

Vernon

Répondre

0

Pour la communication entre subApps, j'aime chaque SubApp pour déclencher une méthode sur leur canal indiquant leur action, ont alors un registre d'événement quelque part sur l'App. J'aime faire cela pour que je puisse voir clairement une liste d'actions quand un événement est déclenché. De plus, à mon avis, il ne devrait pas être la préoccupation de ProductsModules ce qui se passe après l'événement est déclenché

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

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

En ce qui concerne App.navigate('route', {trigger: true}); Je n'aime pas les applications pour être « route conduit ». Les routes doivent être un point d'entrée vers une application, mais c'est tout. J'ai tendance à faire quelque chose comme le

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

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

Hope this helps