Configurando corretamente roteadores para relacionamento entre pais e filhos no backbone Marionette

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

  •  29-10-2019
  •  | 
  •  

Pergunta

Tentando criar uma página que permite aos usuários adicionar, editar e visualizar um pai e filho combinados.

A interface do usuário possui 3 colunas Pai: Lista de Pais Filhos: Criança

Desejo configurar o (s) controlador (es) para que os usuários possam voltar exatamente de onde estavam, mas não vejam a necessidade de tê-los, para que o pai e o filho possam ser editados.

// Aproximando-se usando a marionete backbone, mas ainda tendo alguns pequenos 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);
        }
    };

Ter o "this.ViewClient" parece hacky e também não funciona.

Foi útil?

Solução

Resposta de várias partes, aqui ...

"this.ViewClient não é uma função"

este é um bug no Marionette. o método do controlador é chamado no contexto do roteador em vez do controlador, portanto, a chamada para this.ViewClient está tentando localizá-lo no roteador.

ops.

bug registrado. vai consertar o mais rápido possível. https://github.com/derickbailey/backbone.marionette/issues/38

-

ATUALIZAÇÃO : este bug foi corrigido na v0.5.1 do Backbone.Marionette https://github.com/derickbailey/backbone.marionette

-

para contornar esse problema por enquanto, você pode fazer o seguinte:

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

Se isso não funcionar, você pode precisar usar os métodos bind ou bindAll do Underscore.js para garantir a ligação correta em suas funções de controlador.

Essa solução alternativa não será necessária depois que eu consertar o bug ... espero que mais tarde hoje / esta noite.

é basicamente chamar outras rotas a melhor maneira de manipular várias regiões?

A resposta direta a esta pergunta é não.

Mas você não está chamando uma rota neste caso. Você está chamando um método em seu controlador. Isso está perfeitamente bem - e, na verdade, eu encorajaria isso. É um uso adequado do seu objeto e é uma das coisas que acho que deve ser feito em vez de chamar outro manipulador de rota / roteador.

Roteadores e controladores

Um roteador é um recurso, não um requisito arquitetônico. Seu aplicativo deve funcionar sem um roteador, e um roteador deve apenas adicionar a capacidade de usar favoritos e o botão de avançar / voltar do navegador.

Com essa filosofia em mente (que eu sei que é controversa), usar um controlador como o seu e chamar vários métodos em seu controlador para colocar sua aplicação no estado correto, é uma das abordagens certas a se tomar.

Veja desta forma: se você removeu o roteador do seu aplicativo, seria forçado a chamar métodos diretamente no seu controlador. Para evitar a duplicação de código, você desejará criar muitos métodos pequenos em seu controlador que podem fazer uma coisa muito bem e, em seguida, compor métodos maiores a partir desses métodos menores.

Espero que ajude. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top