Новый маршрутизатор Ember.js: доступ к сериализованным объектам из сегментов родительского динамического маршрута

Уже был аналогичный issue.

Предполагая следующие маршруты:

App.Router.map(function (match) {
  match('/').to('index');
  match('/posts').to('posts', function (match) {
    match('/').to('postsIndex');
    match('/:post_id').to('post', function (match) {
      match('/comments').to('comments', function (match) {
        match('/').to('commentsIndex');
        match('/:comment_id').to('showComment');
      });
    });
  });
});

Можно ли получить доступ к post_id и comment_id в ShowCommentRoute? В противном случае я должен забыть о составных ключах в моих моделях?

Почему аргумент CommentsRoute#model(params) и CommentsIndexRoute всегда пуст? Как получить комментарии Post, когда?

Мой fiddle.

Запустите этот пример (есть консольный журнал, показывающий проблему.

ОБНОВЛЕНИЕ после некоторого расследования:

Только PostRoute будет иметь params.post_id. Только ShowCommentRoute будет иметь params.comment_id и не будет params.post_id.

Это неприемлемо для приложений, где модели имеют составные клавиши. В случае, если мы шаг за шагом переходим к showComment, мы можем получить экземпляр Comment:

App.ShowCommentRoute = Ember.Route.extend({
  model: function(params) {
    var post_id = this.controllerFor('post').get('content.id');
    return App.Comment.find(post_id, params.comment_id);
  }
});

Но это не сработает, если мы непосредственно посетим /posts/1/comments/1. В этом случае this.controllerFor('post') всегда undefined.

  • Если у вас есть вложенные маршруты с динамическими сегментами, вы не можете получить доступ к этим сегментам в *IndexRoute (PostRoute и PostInderRoute в этом примере)
  • В ближайшее время невозможно получить родительскую модель маршрута, когда непосредственно посещает вложенный маршрут.

Ответ 1

Используя ember-1.0.0-rc.1, теперь можно получить доступ к родительской модели маршрута при прямом посещении URL-адреса.

App.ShowCommentRoute = Ember.Route.extend({
  model: function(params) {
    var post = this.modelFor('post');
    return App.Comment.find(post.get('id'), params.comment_id);
  }
});