В последнем 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);
}
});