Sails.js 0.10.4
возвращает несогласованные результаты JSON, в которых существуют вложенные ассоциации. Это вызывает все виды головных болей с вложенными ассоциациями и Ember Data. Каков предпочтительный способ заставить их работать вместе?Sails.js и Ember.js Вложенные ассоциации
Мой стек:
- Sails.js
0.10.4
- Ember CLI
0.0.42
- Ember
1.7.0
- Ember данных
~1.0.0-beta.7
- Эмбер-данные паруса-адаптер:
~2.0.0
Я надеялся использовать адаптер парусов, чтобы впоследствии конвертировать в веб-узлы. Должен ли я просто отказаться от этого и использовать sails-ember-blueprints, пока ассоциации Sails не станут более зрелыми?
Вот что я пытался, предполагая, что три взаимосвязанных моделей, например user [hasMany]>> comment [belongsTo]>> commentType
Вариант 1
- Набор
populate: true
вsails/config/blueprints.js
. - Использование пользовательских сериализаторов в Эмбер, которые используют EmbeddedRecordsMixin
сериализатором может выглядеть следующим образом:
// client/app/serializers/user.js
import DS from 'ember-data';
export default DS.JsonSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
comments: {
embedded: 'always'
}
}
}
Это прекрасно работает на одном уровне ассоциаций, например, A --> B
, однако парусов в настоящее время не заселить вложенными встроенные ассоциации, поэтому для A --> B --> C
вы получите результат, как:
// query the sails API /api/v1/users/1
{
id: 1,
name: 'User1',
comments: [{
id: 1,
name: 'Comment1',
commentType: 1 // id instead of embedded record
}]
}
Вариант 1 Часть 2
Установка атрибута {async: true}
comment.commentType
в модели Эмбер делает не работают из-за несогласованных ответов сервера. Доступ к /api/v1/users/1
даст вам ответ выше с помощью только commentType ID
(это нормально с асинхронным), в то время как доступ к комментариям напрямую даст вам и встроенную запись commentType
, например.
// query the sails API /api/v1/comments/1
{
id: 1,
name: 'Comment1',
commentType: {
id: 1,
name: 'C'
}
}
Ember не нравится :)
Вариант 2
- Держите ассоциации, как обычно в парусах и изменения атрибутов Ember от
DS.belongsTo
кDS.attr('number')
- Эмбер затем можно использовать
setupController
крючок для выполнения отдельного запроса, чтобы вывести данные комментариев
Этот вид работ для взаимоотношений «один к одному», но не очень хорошо играет за отношения hasMany
.
Вариант 3
- Набор
populate: false
вsails/config/blueprints.js
. - Установить все отношения Ember к
async:true
Sails появляется выйти из атрибутов полностью, если populate:false
установлен. Это ожидаемое поведение?
// query Sails API /api/v1/users/1
{
id: 1,
name: "A",
// no mention of comments??
}
Следующий поэтому неопределенный и вызывает ошибку Ember:
myUser.get('comments');
Вариант 4
- Override по умолчанию
find
план для обработки вложенных ассоциаций. (See this SO answer)
Кажется немного слишком много, как изобретать паруса ... Пример приведен для одной должности, но это необходимо обрабатывать заселение нескольких записей. Это быстро входит в асинхронный ад из-за отсутствия метода model.Populate
в Sails.
http://sanestack.com/ может заинтересовать вас. Он автоматически выполняет чертежи для вас и настраивает весь бэкэнд и интерфейс. – Markus