Qual é o caminho certo para entrar e sair dos estados modais com o Ember router v2?
Não consigo descobrir a maneira correta de lidar com estados / visualizações de modos com o novo roteador Ember. Mais geralmente, como você lida com estados que você pode inserir e sair sem afetar o estado "principal" (a URL)?
Por exemplo, um botão "Nova mensagem" que ésempre disponível, independentemente do estado atual da folha. Clicar em "Nova mensagem" deve abrir a nova mensagem modal sobre a visualização atual, sem afetar o URL.
Atualmente, estou usando uma abordagem como esta:
Rotas:
App.Router.map(function() {
this.route('inbox');
this.route('archive');
});
App.IndexRoute = Em.Route.extend({
...
events: {
newMessage: function() {
this.render('new_message', { into: 'application', outlet: 'modalView' });
},
// Clicking 'Save' or 'Cancel' in the new message modal triggers this event to remove the view:
hideModal: function() {
// BAD - using private API
this.router._lookupActiveView('application').disconnectOutlet('modalView');
}
}
});
App.InboxRoute = Em.Route.extend({
...
renderTemplate: function(controller, model) {
// BAD - need to specify the application template, instead of using default implementation
this.render('inbox', { into: 'application' });
}
});
App.ArchiveRoute = ... // basically the same as InboxRoute
application.handlebars:
<button {{action newMessage}}>New Message</button>
{{outlet}}
{{outlet modalView}}
Eu obviamente deixei de fora algum código por brevidade.
Esta abordagem "funciona", mas tem os dois problemas identificados acima:
Estou usando uma API privada para remover a exibição restrita nohideModal
manipulador de eventos.Preciso especificar oapplication
modelo em todas as minhas sub-rotinas, porque se eu não, a implementação padrão derenderTemplate
tentará renderizar no modelo do modal em vez de no aplicativo se você abrir o modal, fechá-lo e, em seguida, navegar entre os estados de caixa de entrada e arquivamento (porque o modelo do modal se tornou olastRenderedTemplate
para o IndexRoute).Obviamente, nenhum desses problemas são dealbreakers, mas seria bom saber se há uma abordagem melhor que estou faltando ou se isso é apenas uma lacuna na API do roteador atual.