使用Ember路由器v2进入和退出模态的正确方法是什么?

时间:2013-01-14 22:29:46

标签: ember.js ember-router

我无法弄清楚使用新的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}}

为了简洁,我显然遗漏了一些代码。

这种方法“有效”,但有上述两个问题:

  1. 我正在使用私有API删除hideModal事件处理程序中的模态视图。
  2. 我需要在所有子路径中指定application模板,因为如果我不这样做,renderTemplate的默认实现将尝试渲染到模态的模板而不是应用程序中打开模态,关闭它,然后在收件箱和存档状态之间导航(因为模态的模板已成为IndexRoute的lastRenderedTemplate
  3. 显然,这两个问题都不是破坏者,但是如果知道我是否缺少更好的方法,或者这只是当前路由器API中的一个缺口,那将会很高兴。

2 个答案:

答案 0 :(得分:4)

我们做同样的事情,但没有访问私有API。 我不知道我们的解决方案是否是最佳实践,但它确实有效。

在我们RootRoute的事件中,我有一个事件(与您的newMessage相同),我们创建视图,我们需要渲染,然后追加它。

events: {
    showNewSomething: function(){
        var newSomethingView = app.NewSomethingView.create({
            controller: this.controllerFor('newSomething')
        });
        newSomethingView.append();
    }
}

这会将模态视图附加到我们的应用中。 取消或保存在newSomethingView我们致电this.remove()以销毁视图并再次从应用中删除。

同样,这不是最佳做法,但它有效。如果有人有更好的解决方案,请随意对此发表评论。

答案 1 :(得分:0)

不知道您是使用Bootstrap Modal脚本还是使用哪一个,但如果您使用,则此问题有一个建议的解决方案。我自己还没有想出所有的作品,但我自己也在寻找类似的解决方案,以便能够以“Ember最佳实践”的方式使用Colorbox