Configurando corretamente roteadores para relacionamento entre pais e filhos no backbone Marionette
-
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.
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. :)