Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.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
Ember.js 如何建立余烬数据中相关模型之间的关系_Ember.js_Ember Data - Fatal编程技术网

Ember.js 如何建立余烬数据中相关模型之间的关系

Ember.js 如何建立余烬数据中相关模型之间的关系,ember.js,ember-data,Ember.js,Ember Data,我假设,如果ember数据中的模型包含与第二个模型相关的id,那么该id也可以用于建立与第二个模型对象的belongsTo关系,正如我创建的问题一样。显然情况并非如此 是否有人知道在恩伯数据存储中存在的两个对象之间建立关系所需的环境是相互关联的?是否必须同时加载相关对象?(或者在RESTAdapter的情况下,在同一请求下通过)以使id引用工作?如果它们不能在同一个请求上通过,那么是否可以在以后的请求上建立这种关系,而不必为查找关系并手动设置关系的请求添加事件处理程序?下面是我看到的问题的一个例

我假设,如果ember数据中的模型包含与第二个模型相关的id,那么该id也可以用于建立与第二个模型对象的belongsTo关系,正如我创建的问题一样。显然情况并非如此

是否有人知道在恩伯数据存储中存在的两个对象之间建立关系所需的环境是相互关联的?是否必须同时加载相关对象?(或者在RESTAdapter的情况下,在同一请求下通过)以使id引用工作?如果它们不能在同一个请求上通过,那么是否可以在以后的请求上建立这种关系,而不必为查找关系并手动设置关系的请求添加事件处理程序?下面是我看到的问题的一个例子:

App.ModelA = DS.Model.extend({
  name:      DS.attr('string'),
  modelBId:  DS.attr('number'),
  modelB:    DS.belongsTo('App.ModelB')
});

App.ModelB = DS.Model.extend({
  name: DS.attr('string')
});

App.ModelB.find(2);       // returns an object

modelA.get('modelBId');   // returns 2
modelA.get('modelB');     // returns null

当您想要从RESTAPI加载/保存数据时,关联对象的ID非常有用。然后可以使用RESTAdapter并发送相关对象的ID

例如,对于
belongsTo
关系,余烬数据假定您将发送一个带有相关对象id的键
model_b_id
。然后,ember数据将处理此对象的加载,通常通过调用API:
GET model\u b/the\u id

也可以通过嵌入关联对象而不是通过id提供引用来加载它们

有关更多示例,请参阅ember数据项目中有关StackOverflow和示例/测试的其他问题。

Adam

我自己从Ember数据开始,这种混乱通常是由于RESTAPI的许多自动化/假设造成的。尝试:

App.ModelA = DS.Model.extend({
  name:      DS.attr('string'),
  modelB:    DS.belongsTo('App.ModelB')
});
其中REST API返回一个模型a,如:

{"model_a":{"name": "Adam", "model_b_id": 2}}

默认情况下,对于任何belongsTo关系,余烬数据有效地将“_id”固定到非融合属性名称上,或者将“_id”固定到任何hasMany上

我仍然不明白的是,API正在发送一个model_b_id以及modelA API调用。但是,所有modelB对象之前都是使用
modelB.find()
调用加载的,因此不需要另一个API调用来获取与modelA关联的modelB数据,也不需要侧加载数据(对于此数据,我不想侧加载它,modelA.find()调用在应用程序中经常发生,但ModelB有点像一个查找表,具有数量有限的不经常更改的值)。那么,ember data是否没有找到相关的modelB对象?b/c数据是否没有侧载?如果相关对象已按您所说的模型加载,ember data将不会触发ajax请求,而是从标识映射中获取它。这能回答你的问题吗?谢谢你在阿德里安的问题上坚持我,我真的很感激。我觉得你就快帮我解决困惑了。身份地图是什么?谷歌搜索让我觉得它可能和我所想的商店(类似于内存浏览器db)一样。如果是这样的话,我认为最后一个
modelA.get('modelB')
将返回与model_b_id 2关联的modelB对象。既然不是,也许身份地图是另一回事。如何通过标识映射使已存在的ID为2的modelB与modelBId为2的modelA关联?是的,标识映射将加载的记录保存在浏览器内存中。它应该如您所说的那样工作,如果不是,您可能在加载
modelA
时遇到问题,或者可能属性
modelBId
是乱七八糟的,您可以尝试不使用它吗?我在想,将modelBId作为一个属性放在那里之前可能会把它弄乱,因此我删除了它。没有任何影响,
modelA.get('modelB')
仍然返回null。可能是某种缓存设置吗?我认为在这两个模型(或它们的属性)周围都没有任何类型的显式缓存设置,但可能有某种类型的隐式缓存?我会继续把问题标记为已回答b/c这里有这么多信息,但我仍然看到问题。谢谢科林,我感谢你的回答。在本例中,我的API将返回一个与“model_a”关联的“model_b_id”的键(这是在modelA实例上设置modelBId属性的方式),因此我认为可能还有其他原因。不过这是个很好的建议,谢谢你的参与。我仍然需要制作JSFIDLE来显示它的发生。