如果嵌套关联存在,Sails.js 0.10.4
将返回不一致的JSON结果。这会导致各种令人头疼的嵌套关联和Ember数据。让这两个人一起工作的首选方式是什么?Sails.js和Ember.js嵌套关联
我的堆栈是:
- Sails.js
0.10.4
- 灰烬CLI
0.0.42
- 灰烬
1.7.0
- 灰烬数据
~1.0.0-beta.7
- 烬数据帆适配器:
~2.0.0
我曾希望使用帆适配器,以便我可以在以后转换为websockets。我应该放弃这一点,并使用sails-ember-blueprints,直到Sails协会更成熟一些?
这里是我试过,假设三个相关的模型例如user [hasMany]>> comment [belongsTo]>> commentType
选项1
- 在
sails/config/blueprints.js
设置populate: true
。 - 灰烬中使用自定义序列,其使用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部分
在灰烬模型设置comment.commentType
属性为{async: true}
呢由于服务器响应不一致而无法工作。访问/api/v1/users/1
将得到上面的回应,只有commentType ID
(这是与异步罚款),而直接访问评论会给你和嵌入commentType
记录,例如,
// query the sails API /api/v1/comments/1
{
id: 1,
name: 'Comment1',
commentType: {
id: 1,
name: 'C'
}
}
灰烬不喜欢这个:)
选项2
- 保持协会评为正常帆和改变从
DS.belongsTo
Ember的属性DS.attr('number')
- 恩贝尔则可以使用
setupController
挂钩执行单独的查询来提取评论数据
这种作品适用于一对一的关系,但并不完全适用于hasMany
关系。
选项3
- 在
sails/config/blueprints.js
设置populate: false
。 - 将所有灰烬的关系,以
async:true
帆出现,如果populate:false
设置为完全离开了属性。这是预期的行为?
// query Sails API /api/v1/users/1
{
id: 1,
name: "A",
// no mention of comments??
}
以下是未定义因此并导致灰烬错误:
myUser.get('comments');
选项4
- 改写默认
find
蓝图来处理嵌套的关联。 (See this SO answer)
似乎有点像重塑Sails ...太多了给出的例子是针对单个帖子,但是这需要处理填充多个记录。由于缺少Sails中的model.Populate
方法,这很快进入异步地狱。
http://sanestack.com/也许对你也有兴趣。它会自动为您实施蓝图,并设置整个后端和前端。 – Markus 2015-01-11 00:55:33