ti-enxame.com

Vários roteadores vs roteador único no BackboneJs

Todos os exemplos que eu vi do Backbone usam um roteador para todo o aplicativo, mas não faria sentido ter um roteador para cada parte do seu aplicativo (cabeçalho, rodapé, palco, barra lateral)? Alguém criou aplicativos com mais de um roteador e quais são suas experiências?

Vamos pensar em um aplicativo complexo com exibições aninhadas: não seria melhor quando uma exibição possui seu próprio roteador que lida com a exibição das subvisões, do que ter um roteador grande que precisa informar a visualização principal para alterar suas subvisões?

O pano de fundo desta pergunta: eu vi muitos paralelos do roteador no backbone e o ActivityMapper no GWT. O ActivityMapper é o único responsável por obter o apresentador certo para uma determinada rota e um determinado contêiner no DOM.

45
Andreas Köberle

eu escrevi um aplicativo (ainda escrevendo) com vários roteadores. no entanto, não é como você pensa, é mais baseado em módulo e não um roteador por visualização ou algo assim.

por exemplo, digamos que eu tenha dois grandes módulos no meu aplicativo, 1 manipulando todos os livros e 1 para os usuários. os livros têm várias visualizações (assim como os usuários), uma lista, uma vista detalhada, uma edição, etc etc ... para que cada módulo tenha seu próprio roteador, que representa seu próprio conjunto de URLs:

// user module...
var userRouter = Backbone.Router.extend({
    routes: {
        "users": "loadUsers",
        "users/add": "addUser",
        "user/:id": "loadUser",
        "user/:id/edit": "editUser"
    }

// ... rest dropped to save the trees (you never know if someone prints this out)
});


// book module
var bookRouter = Backbone.Router.extend({
    routes: {
        "books": "loadBooks",
        "books/add": "addBook",
        "book/:name": "loadBook",
        "book/:name/edit": "editBook"
    }

// ... rest dropped to save the trees (you never know if someone prints this out)
});

portanto, não é como se meus dois roteadores estivessem competindo pela mesma rota, cada um deles lida com seu próprio conjunto de rotas.

edit agora que eu tinha mais informações via Elf Sternberg, sei que por padrão não é possível ter vários roteadores correspondentes na mesma rota. sem uma solução alternativa, como substituir o histórico de backbone ou usar espaços para nome em rotas e expressões regulares para corresponder a essas rotas. mais informações aqui: várias rotas correspondentes agradece a Elf Sternberg pelo link.

23
Sander

Acabei de escrever uma postagem no blog sobre sub-rotinas específicas do módulo no Backbone, que permite definir um "sub-roteador" que presta atenção a tudo após o prefixo de essa rota.

Confira a entrada do blog para obter mais explicações: http://www.geekdave.com/?p=1

Isso significa que você não precisa definir redundantemente o mesmo prefixo repetidamente e também pode carregar sub-rotações preguiçosas à medida que os módulos são acessados. O feedback é muito bem-vindo!

22
Dave Cadwallader

Há um caso limitado, mas importante, quando faz sentido usar vários roteadores. Se você precisar expor apenas um subconjunto das rotas e visualizações do seu aplicativo com base nos dados coletados em tempo de execução (talvez credenciais de login - por exemplo, gerente versus equipe pode ver e navegar entre diferentes conjuntos de visualizações), instanciar apenas o roteador e a exibição adequados Aulas. Isso é significativo porque as rotas podem ser marcadas e enviadas de usuário para usuário. Obviamente, você ainda precisará de verificações no servidor para garantir que um usuário não autorizado não esteja emitindo solicitações depois de navegar para uma visualização que chegou através de um marcador enviado por um usuário autorizado. Mas é melhor projetar o aplicativo para que a exibição não autorizada não seja gerada.

2
Pallavi Anderson