Configuración correcta de enrutadores para la relación entre padres e hijos en backbone Marionette

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

  •  29-10-2019
  •  | 
  •  

Pregunta

Intentando crear una página que permita a los usuarios agregar, editar y ver una combinación de padre e hijo.

La interfaz de usuario tiene 3 columnas Padre: Lista de padres Hijos: Niño

Quiero configurar los controladores para que los usuarios puedan volver a donde estaban, pero no ven la necesidad de tenerlos para que tanto el padre como el hijo puedan ser editables.

// Acercándonos al uso de backbone marionette pero aún teniendo algunos pequeños problemas

    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);
        }
    };

Tener "this.ViewClient" se siente hack y tampoco funciona.

¿Fue útil?

Solución

Respuesta de varias partes, aquí ...

"this.ViewClient no es una función"

esto es un error en Marionette. el método del controlador se llama en el contexto del enrutador en lugar del controlador, por lo que la llamada a this.ViewClient está tratando de encontrarlo en el enrutador.

¡Ups!

error registrado. se arreglará lo antes posible. https://github.com/derickbailey/backbone.marionette/issues/38

-

ACTUALIZACIÓN : este error ahora se corrigió en la v0.5.1 de Backbone.Marionette https://github.com/derickbailey/backbone.marionette

-

para solucionar este problema por ahora, puede hacer lo siguiente:

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

Si eso no funciona, es posible que deba utilizar los métodos bind o bindAll de Underscore.js para garantizar el enlace correcto en las funciones de su controlador.

Esta solución alternativa no será necesaria una vez que solucione el error ... con suerte más tarde hoy / esta noche.

¿Es básicamente llamar a otras rutas la mejor manera de manipular varias regiones?

La respuesta directa a esta pregunta es no.

Pero, en este caso, no estás llamando a una ruta. Estás llamando a un método en tu controlador. Eso está perfectamente bien, y de hecho, lo recomendaría. Es un uso adecuado de su objeto, y es una de las cosas que creo que debería hacerse en lugar de llamar a otro controlador de ruta / enrutador.

Enrutadores y controladores

Un enrutador es una característica, no un requisito arquitectónico. Su aplicación debería funcionar sin un enrutador, y un enrutador solo debe agregar la capacidad de usar marcadores y el botón de avance / retroceso del navegador.

Con esa filosofía en mente (que sé que es controvertida), usar un controlador como el que tiene y llamar a varios métodos en su controlador para llevar su aplicación al estado correcto, es uno de los enfoques correctos a tomar.

Mírelo de esta manera: si eliminó el enrutador de su aplicación, se vería obligado a llamar a métodos en su controlador directamente. Para evitar la duplicación de código, querrá crear muchos métodos pequeños en su controlador que puedan hacer una cosa muy bien, y luego componer métodos más grandes a partir de esos métodos más pequeños.

Espero que te ayude. :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top