11

現在、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"
  }
]

問題が何であるかを正確に伝えることはできません。アサーションはマッピングが必要であると述べているため、知りたいです:

  1. このマッピングとは何か、およびその使用方法。
  2. 返された 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を生成するように構成する方法を知っている人はいますか?

4

3 に答える 3

12

マッピングは DS.RESTAdapter で定義できます。次のようなものを定義しようとすることができると思います。

App.Store = DS.Store.extend({
  adapter: DS.RESTAdapter.create({
    bulkCommit: true,
    mappings: {
      genres: App.Genre
    },
    // you can also define plurals, if there is a unregular plural
    // usually, RESTAdapter simply add a 's' for plurals.
    // for example at work we have to define something like this
    plurals: {
      business_process: 'business_processes' 
      //else it tries to fetch business_processs
    }
  }),
  revision: 4
});

これで問題が解決することを願っています。

アップデート:

現時点では、これは十分に文書化されていません。自分でコードを読んで見つけたのか、Tom Dale が指摘したのかは覚えていません。
とにかく、ここに複数形のポイントがあり ます マッピングについては、私たちはあなたと同じエラーに駆り立てられたと思います.

于 2012-08-30T22:09:18.930 に答える
8

は、次の形式でRESTAdapter返されることを期待しています。JSON

{
  "genres": [{
    "id": 1,
    "name": "action"
  },{
    "id": 2,
    "name": "Drama"
  }]
}

テストはドキュメントの優れたソースです。https://github.com/emberjs/data/blob/master/packages/ember-data/tests/unit/rest_adapter_test.js#L315-329を参照してください。

于 2012-08-29T18:54:50.280 に答える
3

私は Ember Data を使用しrev. 11ていますが、plurals設定が機能しDS.RESTAdapter.createないようです。コードを調べたところ、次のような解決策が見つかりました。

App.Adapter = DS.RESTAdapter.extend({
  bulkCommit: false
})

App.Adapter.configure('plurals', {
  series: 'series'
})
于 2013-03-28T09:10:35.087 に答える