Jaki jest właściwy sposób wprowadzania i opuszczania stanów modalnych za pomocą routera Ember v2?
Nie mogę znaleźć właściwego sposobu obsługi stanów / widoków modalnych za pomocą nowego routera Ember. Bardziej ogólnie, w jaki sposób radzisz sobie ze stanami, które możesz wprowadzić i wyjść bez wpływu na „główny” stan (adres URL)?
Na przykład przycisk „Nowa wiadomość”zawsze dostępne niezależnie od aktualnego stanu liści. Kliknięcie „Nowa wiadomość” powinno otworzyć nową wiadomość modalną nad bieżącym widokiem, bez wpływu na adres URL.
Obecnie używam takiego podejścia:
Trasy:
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}}
Oczywiście pominąłem trochę kodu dla zwięzłości.
Takie podejście „działa”, ale ma dwa problemy określone powyżej:
Używam prywatnego API, aby usunąć widok modalny whideModal
obsługa zdarzeń.Muszę określićapplication
szablon we wszystkich moich podprogramach, ponieważ jeśli nie, domyślna implementacjarenderTemplate
spróbuje renderować do szablonu modalnego zamiast do aplikacji, jeśli otworzysz modalny, zamkniesz go, a następnie przejdziesz między skrzynką odbiorczą i stanem archiwum (ponieważ szablon modalny stał się szablonemlastRenderedTemplate
dla IndexRoute).Oczywiście żaden z tych problemów nie jest łamany przez dealera, ale byłoby miło wiedzieć, czy istnieje lepsze podejście, którego brakuje lub czy jest to luka w bieżącym interfejsie API routera.