現在、ember + emberdata + router + asp.net web api で何かをまとめようとしています。ほとんどは機能しているように見えますが、ember-data がfindAll
モデルのアダプターを通過しようとすると、エラー メッセージが表示されます。
私のバックエンドには、次のようなモデルがあります (C#):
public class Genre {
[Key]
public int Id { get; set; }
[Required]
[StringLength(50, MinimumLength=3)]
public string Name { get; set; }
}
私のアプリでは、ember-data を使用して次のように表します。
App.Genre = DS.Model.extend({
id: DS.attr("number"),
name: DS.attr("string")
}).reopenClass({
url: 'api/genre'
});
次のように、RESTAdapter を使用してアプリで定義された Store もあります。
App.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({
bulkCommit: false
})
});
そして、ストアは私のコントローラーで以下のように使用されます:
App.GenreController = Ember.ArrayController.extend({
content: App.store.findAll(App.Genre),
selectedGenre: null
});
ルーターは次のように定義されます。
App.router = Em.Router.create({
enableLogging: true,
location: 'hash',
root: Ember.Route.extend({
//...
genre: Em.Route.extend({
route: '/genre',
index: Ember.Route.extend({
connectOutlets: function (router, context) {
router.get('applicationController').connectOutlet('genre');
}
})
}),
//...
})
})
アプリケーションを実行すると、同じ構造を持つすべてのオブジェクトに対して次のメッセージが表示されます。
キャッチされないエラー: アサーションに失敗しました: サーバーはキー 0 のハッシュを返しましたが、マッピングがありません
参考までに、サービスが返す json を次に示します。
[
{
"id": 1,
"name": "Action"
},
{
"id": 2,
"name": "Drama"
},
{
"id": 3,
"name": "Comedy"
},
{
"id": 4,
"name": "Romance"
}
]
問題が何であるかを正確に伝えることはできません。アサーションはマッピングが必要であると述べているため、知りたいです:
- このマッピングとは何か、およびその使用方法。
- 返された json は配列であるため、アプリで別のタイプのコントローラーを使用する必要がありますか、または ember-data でこのタイプの json を操作するときに知っておくべきことはありますか? または、サーバーの JsonFormatter オプションを変更する必要がありますか?
どんな助けでも大歓迎です。
問題を理解するのにこれだけでは不十分だと思われる場合は、さらに情報を追加できます。
EDIT : バックエンドでいくつかの変更を加えましたがfindAll()
、サーバーでの同等のアクションにより、出力が次の json としてシリアル化されます。
{
"genres": [
{ "id": 1, "name": "Action" },
{ "id": 2, "name": "Drama" },
{ "id": 3, "name": "Comedy" },
{ "id": 4, "name": "Romance" }
]
}
しかし、まだクライアントにモデルを設定することができず、エラー メッセージが次のように変わりました。
キャッチされないエラー: アサーションに失敗しました: サーバーは主要なジャンルのハッシュを返しましたが、マッピングがありません
他に何が間違っているのかわかりません。
この例外をスローするメソッドはsideload
、次のようなマッピングをチェックします。
sideload: function (store, type, json, root) {
var sideloadedType, mappings, loaded = {};
loaded[root] = true;
for (var prop in json) {
if (!json.hasOwnProperty(prop)) { continue; }
if (prop === root) { continue; }
sideloadedType = type.typeForAssociation(prop);
if (!sideloadedType) {
mappings = get(this, 'mappings');
Ember.assert("Your server returned a hash with the key " + prop + " but you have no mappings", !!mappings);
//...
この呼び出しsideloadedType = type.typeForAssociation(prop);
が返さundefined
れ、エラー メッセージが表示されます。このメソッドは、空の を返すtypeForAssociation()
for キーをチェックします。'associationsByName'
Ember.Map
現時点ではまだこれに対する解決策はありません。
ところで...
私の行動は次のようになりました:
// GET api/genres
public object GetGenres() {
return new { genres = context.Genres.AsQueryable() };
}
// GET api/genres
//[Queryable]
//public IQueryable<Genre> GetGenres()
//{
// return context.Genres.AsQueryable();
//}
Ember-Dataが期待するように(のように)json出力を生成する構成オプションが見つからなかったため、 json.NETによってシリアル化される元の実装を削除する必要がありました{resource_name : [json, json,...]}
。これの副作用は、組み込みの OData サポートを失ったことですが、それを維持したいと考えています。コレクション用に異なるjsonを生成するように構成する方法を知っている人はいますか?