Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有一对一关系的嵌入式json模型_Json_Ember.js_Ember Data - Fatal编程技术网

具有一对一关系的嵌入式json模型

具有一对一关系的嵌入式json模型,json,ember.js,ember-data,Json,Ember.js,Ember Data,我寻找了一个关于这是如何工作的清晰解释,但还没有找到。我正在寻找一个清晰详细的解释,假设我是所有这些框架的新手 所以我的问题是,我正在编写一个应用程序,前端使用Ember.js(带有Ember cli),后端使用Java中的Play框架。我正试图让我的前端消化一些来自API的json。以下是json: { "buildings": [ { "id": 0, "createdDateTime": "2015-03-27T06:39:19.913

我寻找了一个关于这是如何工作的清晰解释,但还没有找到。我正在寻找一个清晰详细的解释,假设我是所有这些框架的新手

所以我的问题是,我正在编写一个应用程序,前端使用Ember.js(带有Ember cli),后端使用Java中的Play框架。我正试图让我的前端消化一些来自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
    }]
}
下面是我的代码:

//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模型、从ember cli导出以及以下内容如何工作)。有人能详细解释一下它是如何工作的吗(带有EmbeddedRecordsMixin的RESTSerializer、{embedded:'always'}属性和其他可用选项)?任何澄清都将不胜感激

让我们也把它带到下一个层次,比如说我不希望每个地址都有一个id,因为它们不应该被使用超过一次(不能在同一个地址有两个建筑物)。我将如何实现这一点?也许我会将地址存储在db中我的building对象的同一记录中,而不需要额外的地址表。基于这些解决方案,最好的方法是什么(如果有更好的解决方案,请随时提出)

请注意,我已经阅读了以下链接:

  • (这并没有说任何关于EmbeddedRecordsMixin的事情)
  • (谈论App.Adapter.Map,我也不明白)
  • (非常有趣的项目,可能正是我想要的)

谢谢大家!

您的大多数问题的答案都可以通过仔细阅读

具体而言:

使用{embedded:'always'}作为DS.attr的选项是无效的 设置嵌入式记录的方法

(意思是只要你确定了你对关系的归属,你就很好)

资源{embedded:'always'}的attrs选项是简写的 用于:

但真正的答案是,一切都在代码中!读一读,再往下看一点,写得很好,你应该能够追踪到底发生了什么

基本上,一旦您告诉序列化程序有嵌入的记录(通过
{key:{embedded:{everys'}}
),它就会在JSON中找到该键,并将其反序列化为一个Ember对象(只要它找到一个定义的带有该键的Ember对象,在您的情况下是“address”)


至于你们的下一个问题,我想回答我自己的问题:你们的大楼有租户吗?如果是这样的话,它们可能会有地址,您可能希望通过tenant.address而不是tenant.building.address访问它,所以请继续将address设置为自己的表。这可能会在不久的将来帮你省去一些麻烦。

谢谢你的回答!我一回到家就要去更深入地看一看。好问题,但答案是否定的,这里的建筑对象不会有任何租户。如果是这样的话,我会百分之百同意你。但在我的情况下,它将(而且必须)遵循严格的1对1关系。快速评论,说我听从了你的建议,仔细阅读了文件。我找到了我所有的答案(来自医生和你的答案)。我还尝试了ember-data.model-fragments,它就像一个符咒!它使您能够处理没有任何id的嵌套对象。我确实理解EmberJs为何尝试强制执行它,但在某些情况下,此工具非常有用,可以避免在后端添加不可用的id字段。再次感谢你!好交易。很乐意帮忙。我知道有一种叫做模型碎片的东西。双赢。
1 {   
2   serialize: 'records',   
3   deserialize: 'records' 
4 }