Подтвердить что ты не робот

Как ссылаться на вложенные ресурсы в Ember.js?

Предположим, что у вас есть следующие маршруты в приложении Ember.

App.Router.map(function() {
  this.resource('series', function() {
    this.resource('serie', { path: '/:serie_id' }, function() {
      this.resource('seasons', function() {
        this.resource('season', { path: '/:season_id' }, function() {
          this.resource('episodes', function() {
            this.resource('episode', { path: '/:episode_id' });
          })
        });
      });
    });
  });
});

Как мне связать конкретный эпизод с помощью помощника linkTo, который предоставляет Handlebars? Другими словами, как Эмбер выясняет, какими должны быть другие параметры URL-адреса, то есть serie_id и episode_id? В документации указано, что я должен передать модель episode на маршрут episode, как показано ниже.

{{#linkTo "episode" episode}}

Это ссылка на следующую структуру URL.

/series/:serie_id/seasons/:season_id/episodes/:episode_id/

Когда я использую помощник linkTo, подобный этому, Ember выдает ошибку, сообщающую мне, что он не может вызывать get с id на undefined. Я предполагаю, что он использует модель episode, чтобы выяснить, что такое serie_id и episode_id, и я предполагаю, что модель должна соответствовать определенному соглашению (структуре или чертежу) для Ember, чтобы найти эти id с.

Это те аспекты, которые мне труднее всего встретить в Ember. Это не очень прозрачно, даже если вы используете Ember в режиме отладки. Любые указатели или ссылки очень ценятся.

ОБНОВЛЕНИЕ 1: После некоторого копания я узнал, что метод route serialize является ключевым элементом в выполнении этого. Однако, когда я использую помощник linkTo, как показано выше, модель, переданная методу маршрута serialize по какой-либо причине undefined (хотя это не когда передается помощнику linkTo. к этому открытию можно найти здесь.

ОБНОВЛЕНИЕ 2: Оказывается, метод serieSeason route serialize получает неправильную модель, эпизод вместо сезона, когда создается ссылка. Однако неясно, почему он получает неправильную модель. Где параметр model метода serialize исходит из?

ОБНОВЛЕНИЕ 3: помощник linkTo отлично работает, если я возвращаю статические данные из метода serialize для каждого используемого маршрута, что означает, что помощник linkTo не участвует в проблеме.

4b9b3361

Ответ 1

Оказывается, ответ можно найти в правильно документированном источнике Ember... потому что это то, что он делает после поиска в Интернете в течение нескольких дней.

Ответ прост. Помощник linkTo принимает несколько моделей. Для каждого динамического сегмента целевого URL вы передаете соответствующую модель. Каждая прошедшая модель станет моделью соответствующего маршрута в целевом URL. В примере, описанном выше, это приводит к следующему.

{{#linkTo "episode" serie season episode}}

Модель serie будет передана на маршрут serie, модель season на маршрут season и модель episode на маршрут episode. Что смущает многих разработчиков, так это то, что маршрут model не запускается при использовании помощника linkTo. Это не слишком удивительно, если вы понимаете, что разработчик предоставляет (или может предоставить) модель для соответствующего маршрута, передавая одну или несколько моделей (или ноль).

Поскольку документации для глубоко вложенных ресурсов недостаточно, не было тривиально узнать, как помощник linkTo выполняет свою работу под капотом. Дайвинг в источнике Ember определенно помогает ускорить работу с каркасом.