2014-08-30 3 views
0

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.

ответ

0

Мне пришлось отказаться от адаптера ember и вместо этого использовать Sails blueprints. Установив модель Ember async на false и performSideload на true на чертежи Sails, я могу использовать данные с боковой загрузкой, которые отправляют паруса без проблем.

+1

http://sanestack.com/ может заинтересовать вас. Он автоматически выполняет чертежи для вас и настраивает весь бэкэнд и интерфейс. – Markus

Смежные вопросы