我的适配器用于findHasMany
加载hasMany
关系的子记录。我的适配器方法findHasMany
直接基于. 它取回点播的内容,最终做了以下两个操作:findHasMany
hasMany
store.loadMany(type, hashes);
// ...
store.loadHasMany(record, relationship.key, ids);
(如果问题存在,完整的代码findHasMany
如下,但我不这么认为。)
真正奇怪的行为是:似乎在某个地方loadHasMany
(或在一些后续的异步过程中)只有第一个和最后一个子记录得到它们的逆belongsTo
属性 set,即使所有的子记录都被添加到hasMany
一边。即,如果posts/1
有 10 条评论,这就是我在加载完所有内容后得到的:
var post = App.Posts.find('1');
post.get('comments').objectAt(0).get('post'); // <App.Post:ember123:1>
post.get('comments').objectAt(1).get('post'); // null
post.get('comments').objectAt(2).get('post'); // null
// ...
post.get('comments').objectAt(8).get('post'); // null
post.get('comments').objectAt(9).get('post'); // <App.Post:ember123:1>
我的适配器是 的子类DS.RESTAdapter
,我不认为我在我的适配器或序列化程序中重载了任何会导致这种行为的东西。
有没有人见过这样的东西?这很奇怪,尽管有人可能知道为什么会这样。
额外的
UsingfindHasMany
让我hasMany
仅在访问属性时才加载内容(在我的情况下很有价值,因为计算 ID 数组会很昂贵)。所以说我有经典的帖子/评论示例模型,服务器返回帖子/1:
{
post: {
id: 1,
text: "Linkbait!"
comments: "/posts/1/comments"
}
}
然后我的适配器可以/posts/1/comments
按需检索,如下所示:
{
comments: [
{
id: 201,
text: "Nuh uh"
},
{
id: 202,
text: "Yeah huh"
},
{
id: 203,
text: "Nazi Germany"
}
]
}
这是findHasMany
我的适配器中方法的代码:
findHasMany: function(store, record, relationship, details) {
var type = relationship.type;
var root = this.rootForType(type);
var url = (typeof(details) == 'string' || details instanceof String) ? details : this.buildURL(root);
var query = relationship.options.query ? relationship.options.query(record) : {};
this.ajax(url, "GET", {
data: query,
success: function(json) {
var serializer = this.get('serializer');
var pluralRoot = serializer.pluralize(root);
var hashes = json[pluralRoot]; //FIXME: Should call some serializer method to get this?
store.loadMany(type, hashes);
// add ids to record...
var ids = [];
var len = hashes.length;
for(var i = 0; i < len; i++){
ids.push(serializer.extractId(type, hashes[i]));
}
store.loadHasMany(record, relationship.key, ids);
}
});
}