Configuration correcte des routeurs pour la relation entre les enfants à la parentalité dans Backbone Marionette

StackOverflow https://stackoverflow.com/questions/9399602

  •  29-10-2019
  •  | 
  •  

Question

Essayer de créer une page qui permet aux utilisateurs d'ajouter l'édition et de visualiser un enfant parent combiné.

UI a 3 colonnes parent: Liste des parents Enfants: Enfant

Je souhaite configurer les contrôleurs pour que les utilisateurs puissent revenir à celles-ci, mais ne voient pas le besoin de l'avoir afin que le parent et l'enfant puissent être modifiables.

// se rapprocher en utilisant la marionnette de la colonne vertébrale mais toujours de petits problèmes

    MyRouter = Backbone.Marionette.AppRouter.extend({
        appRoutes: {
            '': 'AddClient',
            'View/:clientid': 'ViewClient',
            'Edit/:clientid': 'EditClient',
            'View/:clientid/Add': 'PolicyAdd',
            'View/:clientid/View/:policyid': 'PolicyView',
            'View/:clientid/Edit/:policyid': 'PolicyEdit'
        }
    });

    someController = {
        AddClient: function () {
            var someView = new ClientAdd();
            MyApp.clientPane.show(someView);
        },
        ViewClient: function (clientid) {
            var someView = new ClientView();
            MyApp.clientPane.show(someView);
        },
        EditClient: function (clientid) {
            var someView = new ClientEdit();
            MyApp.clientPane.show(someView);
        },
        PolicyAdd: function (clientid) {
            this.ViewClient(clientid);
            var someView = new PolicyAdd();
            MyApp.policyPane.show(someView);
        },
        PolicyView: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyView();
            MyApp.policyPane.show(someView);
        },
        PolicyEdit: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyEdit();
            MyApp.policyPane.show(someView);
        }
    };

Avoir le "this.viewClient" se sent hacky et ne fonctionne pas non plus.

Était-ce utile?

La solution

Réponse en plusieurs parties, ici ...

"this.viewClient n'est pas une fonction"

Ceci est un bug dans Marionette. La méthode du contrôleur est appelée dans le contexte du routeur au lieu du contrôleur, donc l'appel à this.ViewClient essaie de le trouver sur le routeur.

Oops.

bug enregistré. réparera dès que possible. https://github.com/derickbailey/backbone.marionette/issues/38

--

METTRE À JOUR: Ce bogue est maintenant corrigé en V0.5.1 de Backbone.Marionette https://github.com/derickbailey/backbone.marionette

--

Pour contourner ce problème pour l'instant, vous pouvez le faire:

PolicyEdit: {
  someController.ViewClient();
  // ...
}

Si cela ne fonctionne pas, vous devrez peut-être utiliser des traits de souplesse.js ' bind ou bindAll Méthodes pour assurer la liaison correcte sur vos fonctions de contrôleur.

Ces solutions de contournement ne seront pas nécessaires une fois que je serai corrigé le bogue ... espérons-le plus tard aujourd'hui / ce soir.

Est-ce que appeler d'autres itinéraires est-il la meilleure façon de manipuler plusieurs régions?

La réponse directe à cette question est non.

Mais, vous n'appelez pas un itinéraire dans ce cas. Vous appelez une méthode sur votre contrôleur. C'est parfaitement bien - et en fait, j'encourage cela. C'est une utilisation appropriée de votre objet, et c'est l'une des choses qui, je pense, devraient être faites au lieu d'appeler un autre gestionnaire d'itinéraire / routeur.

Routeurs et contrôleurs

Un routeur est une caractéristique, pas une exigence architecturale. Votre application doit fonctionner sans routeur, et un routeur ne doit qu'ajouter la possibilité d'utiliser des signets et le bouton avant / arrière du navigateur.

Avec cette philosophie à l'esprit (ce que je sais est controversé), en utilisant un contrôleur comme vous avez et en appelant plusieurs méthodes sur votre contrôleur afin d'amener votre application à l'état correct, est l'une des bonnes approches à adopter.

Regardez-le de cette façon: si vous supprimez le routeur de votre application, vous seriez obligé d'appeler directement des méthodes sur votre contrôleur. Pour éviter la duplication du code, vous voudrez créer de nombreuses petites méthodes sur votre contrôleur qui peuvent très bien faire une chose, puis composer des méthodes plus grandes sur ces méthodes plus petites.

J'espère que cela pourra aider. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top