我无法找出使用新 Ember 路由器处理模态状态/视图的正确方法。更一般地说,您如何处理可以进入和退出而不影响“主要”状态(URL)的状态?
例如,无论当前叶子状态如何,始终可用的“新消息”按钮。单击“新消息”应在当前视图上打开新消息模式,而不会影响 URL。
目前,我正在使用这样的方法:
路线:
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}}
为了简洁起见,我显然省略了一些代码。
这种方法“有效”,但存在上述两个问题:
- 我正在使用私有 API 来删除
hideModal
事件处理程序中的模式视图。 - 我需要
application
在我的所有子路由中指定模板,因为如果我不这样做,renderTemplate
如果您打开模式,关闭它,然后在收件箱之间导航,默认实现将尝试呈现到模式的模板而不是应用程序中和存档状态(因为模态的模板已成为lastRenderedTemplate
IndexRoute 的模板)。
显然,这些问题都不是破坏者,但很高兴知道我是否缺少更好的方法,或者这只是当前路由器 API 中的一个差距。