Пожалуйста, смотрите связанный твиддл https://ember-twiddle.com/e3872f1410e0d844b6d6c6bc9a2c9dc1
// models/parent.js
export default class extends Model {
@attr('string') name;
@hasMany('child') children;
}
// models/child.js
export default class extends Model {
@attr('string') name;
}
// routes/application.js
export default Route.extend({
model() {
return this.store.findAll('parent');
}
});
// routes/second-route.js
export default Route.extend({
model(params) {
return this.store.findRecord('parent', params.parent_id, {
include: 'children'
});
}
});
//templates/application.hbs
{{#each this.model as |parent|}}
<div>{{parent.name}}</div>
<LinkTo @route = "second-route" @model = {{parent.id}}>
Go to second route with this model
</LinkTo>
{{/each}}
{{outlet}}
//templates/second-route.hbs
{{#each this.model.children as |child|}}
<div>{{child.name}}</div>
{{else}}
<div>Nothing to display</div>
{{/each}}
В угольном вихре
Я ожидал, что шаблон будет отображаться только после завершения запроса к /parents/1
, но это не так.
Флаги на обещанных прокси-серверах, кажется, не меняются ни в какой момент.
🤔 А знаете ли вы, что...
JavaScript можно использовать для манипуляции DOM (Document Object Model), что позволяет изменять содержимое и структуру веб-страницы.
Шаблон не ожидает, потому что обещание немедленно разрешается, поскольку запись найдена в хранилище.
Я бы хотел, чтобы был лучший API, но я разветвил ваш твидл и показал решение: https://ember-twiddle.com/af0a823fc73474db1c09083c429fef4f?openFiles=models.parent%5C.js%2C&route=%2Fsecond-route% 2Ф1
Основной код таков:
// app/model/parent.js
get childrenLoading() {
return this.hasMany('children').load().isPending;
}
this.hasMany('...')
— это API-интерфейс Ember Data низкого уровня, который возвращает ссылку на отношения. Метод load() вызывает загрузку, если она еще не загружена, но, что более важно, возвращает обещание, которое будет разрешено при загрузке отношения.
Подробнее о классе HasManyReference можно прочитать в API