私のアダプターは、リレーションシップfindHasMany
の子レコードをロードするために使用します。hasMany
私のアダプタ メソッドは、 のテスト ケースにfindHasMany
直接基づいています。オンデマンドのコンテンツを取得し、最終的に次の 2 つの操作を実行します。findHasMany
hasMany
store.loadMany(type, hashes);
// ...
store.loadHasMany(record, relationship.key, ids);
(問題がある場合に備えて、の完全なコードをfindHasMany
以下に示しますが、そうではないと思います。)
本当に奇妙な動作は次のとおりです。すべての子レコードが側に追加されているにもかかわらず、どこかloadHasMany
(または後続の非同期プロセス) のどこかで、最初と最後の子レコードのみが逆のbelongsTo
プロパティ セット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
、アダプターまたはシリアライザーでこの動作を引き起こすものをオーバーロードしているとは思いません。
誰かが前にこのようなものを見たことがありますか? 誰かがなぜそれが起こっているのか知っているかもしれませんが、それは十分に奇妙です。
追加
を使用すると、プロパティがアクセスされた場合findHasMany
にのみ の内容をロードできhasMany
ます (ID の配列を計算するとコストがかかるため、私の場合は価値があります)。たとえば、古典的な投稿/コメントのサンプル モデルがあるとします。サーバーは posts/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);
}
});
}