Configurazione corretta dei router per la relazione genitore / figlio nella spina dorsale Marionette

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

  •  29-10-2019
  •  | 
  •  

Domanda

Tentativo di creare una pagina che consenta agli utenti di aggiungere, modificare e visualizzare un genitore figlio combinato.

L'interfaccia utente ha 3 colonne Genitore: Elenco dei genitori Figli: figlio

Desidero configurare i controller in modo che gli utenti possano tornare esattamente dove si trovavano ma non vedono la necessità di averli in modo che sia il genitore che il figlio possano essere modificabili.

// Avvicinarsi usando la marionetta della spina dorsale ma con ancora qualche piccolo problema

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

Avere "this.ViewClient" sembra hacker e inoltre non funziona.

È stato utile?

Soluzione

Risposta in più parti, qui ...

"this.ViewClient non è una funzione"

questo è un bug in Marionette. il metodo del controller viene chiamato nel contesto del router anziché del controller, quindi la chiamata a this.ViewClient sta cercando di trovarlo sul router.

oops.

bug registrato. risolverà al più presto. https://github.com/derickbailey/backbone.marionette/issues/38

-

AGGIORNAMENTO : questo bug è stato corretto nella v0.5.1 di Backbone.Marionette https://github.com/derickbailey/backbone.marionette

-

per ovviare a questo problema per ora, puoi farlo:

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

Se non funziona, potrebbe essere necessario utilizzare i metodi bind o bindAll di Underscore.js per garantire l'associazione corretta alle funzioni del controller.

Queste soluzioni alternative non saranno necessarie una volta risolto il bug ... si spera più tardi oggi / stasera.

sta fondamentalmente chiamando altre rotte il modo migliore per manipolare più regioni?

La risposta diretta a questa domanda è no.

Ma in questo caso non stai chiamando una route. Stai chiamando un metodo sul tuo controller. Va benissimo - e in realtà, lo incoraggerei. È un uso corretto del tuo oggetto ed è una delle cose che penso dovrebbero essere fatte invece di chiamare un altro gestore di route / router.

Router e controller

Un router è una funzionalità, non un requisito architettonico. La tua app dovrebbe funzionare senza un router e un router dovrebbe aggiungere solo la possibilità di utilizzare i segnalibri e il pulsante avanti / indietro del browser.

Con questa filosofia in mente (che so essere controversa), utilizzare un controller come il tuo e chiamare più metodi sul tuo controller per portare la tua applicazione allo stato corretto, è uno degli approcci giusti da adottare.

/ p>

Guardala in questo modo: se rimuovi il router dalla tua app, saresti costretto a chiamare i metodi direttamente sul tuo controller. Per evitare la duplicazione del codice, ti consigliamo di creare molti piccoli metodi sul tuo controller che possono fare una cosa molto bene, e quindi comporre metodi più grandi da quei metodi più piccoli.

Spero che questo aiuti. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top