В последнем Ember, как вы связываетесь с маршрутом только с идентификатором/именем модели, а не предоставляете все его атрибуты на странице ссылок?

У меня возникла проблема при преобразовании с Ember 1.0-pre2 в последний мастер (43354a98) и новый маршрутизатор, а именно -

Если у меня есть маршрут, который загружает только имя и идентификатор для группы записей и пытается связать каждую из этих записей с другим маршрутом, который должен отображать полную модель, когда я прихожу на новый маршрут, новая модель никогда не загружается, а имена и идентификаторы являются единственными доступными атрибутами.

Пример кода:

App.Router.map(function() {
  this.route("index");
  this.resource("birds");
  this.resource("bird", {
    path: "/birds/:bird_id"
  });
});

App.BirdsController = Ember.ArrayController.extend({
  birds: [
    {
      name: "Pigeon",
      id: "b.15"
    }, {
      name: "Chicken",
      id: "b.133"
    }, {
      name: "Turkey",
      id: "b.126"
    }, {
      name: "Ostrich",
      id: "b.4"
    }, {
      name: "Barn Owl",
      id: "b.47"
    }
  ]
});

App.BirdRoute = Ember.Route.extend({
  model: function(params) {
    return App.Bird.find(params.bird_id);
  }
});

{{#each bird in birds}}
  <li>{{#linkTo "bird" bird}}{{bird.name}}{{/linkTo}}</li>
{{/each}}

где App.Bird.find() запускает некоторый XHR для создания Ember.Object из набора удаленных API (не используя данные ember-data). Список птиц жестко закодирован в контроллер только для этого примера, чтобы упростить проблему; в моем реальном приложении список исходит из удаленного API.

Поведение, которое я вижу, заключается в том, что если вы начинаете/птицы и нажимаете одну из ссылок, маршрутизатор переходит на "птицу", и вы приходите на /#/birds/b.5, но App.Bird.find() никогда не вызывается, и единственными данными, которые у меня есть на странице, являются "имя" и "id". Однако, если вы затем перезагрузите страницу, она вызывает приложение App.Bird.find() и правильно создает и отображает модель.

Есть ли способ принудительно удалить десериализацию из идентификатора в URL-адресе или просто передать идентификатор linkTo, а не объект, который он будет считать завершенным? У меня была аналогичная реализация, отлично работающая со старым маршрутизатором.

Ответы

Ответ 1

Кажется, что model hook для App.BirdRoute никогда не вызывается при навигации с помощью {{#linkTo}}... возможно, это связано с тем, что с помощью {{#linkTo}} вы передаете объект маршруту с маршрута birds и ember не думает, что вам нужно будет вызвать model, поскольку он считает, что идентификатор уже был десериализован в объект. Это имеет смысл, поскольку model вызывается при перезагрузке страницы.

Я использовал крюк setupController, чтобы вызвать ваш метод App.Bird.find() и передать этот результат в контроллер. Это вызвано прямым URL-адресом или кликом {{#linkTo}}. Если вызывается вспомогательной ссылкой {{#linkTo}} setupController, параметр model будет объектом bird, переданным с помощью помощника {{#linkTo}}. Если вы вызываете непосредственно из URL-адреса, возвращаемое значение из model -хвата будет передано в setupController в качестве параметра model.

Вот пример JSFiddle

пример с доступным URL

App.BirdRoute = Ember.Route.extend({
  model: function(params) {
    return {id: params.bird_id};
  },
  setupController: function(controller, model) {
    var bird_model = App.BirdTest.find(model.id);
    controller.set("content", bird_model);
  }
});