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.

questionAnswers(2)

yourAnswerToTheQuestion