我搜索了一个关于它是如何工作的明确解释,但还没有找到。我正在寻找一个清晰而详细的解释,假设我是所有这些框架的新手。
所以这是我的问题,我正在使用Ember.js(使用Ember-cli)和Java下的Play-framework下的后端编写应用程序。我正试图让我的前端消化一些从我的API中出来的json。这是json:
{
"buildings": [
{
"id": 0,
"createdDateTime": "2015-03-27T06:39:19.913Z",
"address": {
"id": 1,
"city": "City",
"civicNumber": 1287,
"country": "Canada",
"postalZipCode": "G1Q1Q9",
"provinceOrState": "QC",
"streetName": "A Street Name"
},
"cost": 1000000,
"earnings": 2300,
"mainPicturePath": "http://dummyimage.com/200x200/999/fff.png&text=Building",
"type": "DUPLEX",
"yearOfBuilt": 1998
},
{
"id": 1,
"createdDateTime": "2015-03-27T06:39:19.935Z",
"address": {
"id": 2,
"city": "City",
"civicNumber": 1289,
"country": "Canada",
"postalZipCode": "G1Q1Q9",
"provinceOrState": "QC",
"streetName": "A Street Name"
},
"cost": 980000,
"earnings": 670,
"mainPicturePath": "http://dummyimage.com/200x200/999/fff.png&text=Building",
"type": "TRIPLEX",
"yearOfBuilt": 1980
}]
}
这是我的emberjs代码:
//models/building.js
export default DS.Model.extend({
type: DS.attr('string'),
address: DS.belongsTo('address', {embedded: 'always'}),
cost: DS.attr('number'),
yearOfBuilt: DS.attr('number'),
earnings: DS.attr('number'),
createdDateTime: DS.attr('date'),
mainPicturePath: DS.attr('string')
});
//models/address.js
export default DS.Model.extend({
civicNumber: DS.attr('number'),
streetName: DS.attr('string'),
city: DS.attr('string'),
provinceOrState: DS.attr('string'),
country: DS.attr('string'),
postalZipCode: DS.attr('string'),
building: DS.belongsTo('building', {embedded: 'always'})
});
//serializers/building.js
export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
address: {embedded: 'always'}
}
});
这不会引发任何错误并且正常工作。问题是,我不完全理解构建中嵌入对象地址的代码(我确实理解DS模型, export >来自ember-cli和 belongsTo 的工作)。有人可以详细解释我它是如何工作的(带有EmbeddedRecordsMixin的RESTSerializer,{embedded:'always'}属性和其他可用选项)?任何澄清都将得到更多的赞赏。
让我们把它提升到一个新的水平,比如说我不希望每个地址都有一个id,因为它们永远不会被使用多次(不能在同一个地址有2个建筑物)。我怎么做到这一点?也许我会将地址存储在数据库中我的构建对象的相同记录中,并且不需要额外的地址表。基于这些解决方案,最好的方法是什么(如果有的话,可以随意提出更好的解决方案)?
请注意,我已阅读以下链接:
谢谢!
答案 0 :(得分:1)
通过仔细阅读EmbeddedRecordsMixin Docs
,可以找到大部分问题的答案具体来说:
使用{embedded:' always' }作为DS.attr的选项不是有效的 设置嵌入式记录的方法。
(意思是只要你定义了你所属的关系,你就会很好)
和
资源的attrs选项{embedded:' always'是简写 为:
1 { 2 serialize: 'records', 3 deserialize: 'records' 4 }
但真正的答案是,它完全在代码中!请继续阅读here并稍微向下here,它写得非常好,您应该能够追踪正在发生的事情。
基本上发生的事情是,一旦你告诉序列化器有嵌入的记录(通过{key: {embedded: 'always' } }
),它会在你的JSON中找到该密钥并将其反序列化为Ember对象(只要它找到一个定义的Ember)具有该密钥的对象,在您的情况下,地址')。
就您的下一级问题而言,我会回答我自己的问题:您的建筑物是否有租户?如果是这样,他们可能会有地址,你可能想要通过tenant.address而不是tenant.building.address来访问它,所以继续进行地址并将其设置为自己的表。它可能会在不久的将来为您节省一些麻烦。