私は現在ember + emberdata + router + asp.net web apiと一緒に何かを入れようとしています。そのほとんどはうまくいくようですが、ember-dataが私のモデルのアダプタでfindAll
に接続しようとするとエラーメッセージが表示されます。私もお店を持っているEmber-Data: "マッピング"の仕組み
App.Genre = DS.Model.extend({
id: DS.attr("number"),
name: DS.attr("string")
}).reopenClass({
url: 'api/genre'
});
:
私のアプリでは、私は燃えさし-データを使用して、このようにそれを表現public class Genre {
[Key]
public int Id { get; set; }
[Required]
[StringLength(50, MinimumLength=3)]
public string Name { get; set; }
}
:私はこのようなモデル(C#)を持っている私のバックエンドで
そのようRESTAdapterを使用して、私のアプリケーションで定義されている:
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');
}
})
}),
//...
})
})
のように定義されます。参考のために
Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mappings
を、ここですサービスが復帰している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" }
]
}
しかし、私はまだ取得することはできませんそれは、クライアントで私のモデルを投入すると、私のエラーメッセージがこれに変更されました:私は間違っているかもしれない他に何わからない
Uncaught Error: assertion failed: Your server returned a hash with the key genres but you have no mappings
を。
この例外をスローするメソッドは、このようなマッピングの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()
メソッドは、'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();
//}
私は設定を見つけることができなかったとして、私はjson.NETによってシリアライズされます元の実装を削除する必要がありましたEmber-Dataが期待するようにjson出力を生成するオプション({resource_name : [json, json,...]}
のように)。この副作用は、組み込みのODataサポートを失ったことですが、私はそれを保持したいと思います。誰も私はコレクションのために別のjsonを生成するためにそれを設定することができます知っていますか?
両方の答えが役に立った、私は本当にマッピングを設定する場所を知らなかったと思います。今度は、ビューとテンプレートで作業を始めます。ありがとうSylvain – MilkyWayJoe
これで最後のことは、私は 'マッピング'の詳細を見つけることができませんでした。私がどこでそれを見つけたのかを指摘できますか?ソースコードのみであれば?それはreadme thoで利用できるはずです。 – MilkyWayJoe
あなたは大歓迎です:) –