23

私は Ember-Data Rest-Adapter を使用しており、サーバーから返された JSON は基本的にActive Model Serializers Documentationのものと似ています

{
  "meta": { "total": 10 },
  "posts": [
    { "title": "Post 1", "body": "Hello!" },
    { "title": "Post 2", "body": "Goodbye!" }
  ]
}

サーバーからのデータのフェッチは機能しますが、残念ながら、JSON 応答からメタ情報にアクセスできる場所を特定できません。

ember-data の github issue での私の調査によると、メタ情報のサポートはcommit 1787bffで実装されているようです。

しかし、テスト ケースを使用しても、メタ情報にアクセスする方法を理解できませんでした。

App.PostController = Ember.ArrayController.extend({
   ....
   requestSearchData: function(searchParams){
      posts = App.Post.find(searchParams);
      this.set('content', posts);
      // don't know how to access meta["total"]
      // but I want to do something like this:
      // this.set('totalCount', meta["total"])
   }
})

あなたの誰かが私のためにこれについていくつかの光を当てることができますか? Ember API の動きが速いことは承知していますが、ほんの一部が欠けているだけであり、これは実際に可能であると確信しています。

4

3 に答える 3

7

ember-data を使用して、サーバーの応答からメタ情報を抽出するためのよりクリーンなアプローチを見つけました。

期待するメタ情報 (この場合はページネーション) をシリアライザーに伝える必要があります。

 App.serializer = DS.RESTSerializer.create();

 App.serializer.configure({ pagination: 'pagination' });

 App.CustomAdapter = DS.RESTAdapter.extend({
   serializer: App.serializer
 });

 App.Store = DS.Store.extend({
   adapter: 'App.CustomAdapter'
 });

その後、サーバーがページネーション オブジェクトを含むメタ プロパティを送信するたびに、このオブジェクトはTypeMaps、要求されたモデル クラスのストアのプロパティに追加されます。

たとえば、次の応答があります。

  {
    'meta': {'pagination': { 'page': 1, 'total': 10 } },
    'posts':[
      ...
    ]
  }

TypeMapApp.Post-Model の には、投稿が読み込まれた後にページネーション オブジェクトが含まれます。

ストアの TypeMaps プロパティを直接観察することはできないため、計算されたプロパティを PostsController に追加して、リクエストのページネーション メタ情報にアクセスできるようにしました。

 App.PostsController = Ember.ArrayController.extend({
    pagination: function () {
      if (this.get('model.isLoaded')) {
        modelType = this.get('model.type');
        this.get('store').typeMapFor(modelType).metadata.pagination
      }
    }.property('model.isLoaded')
 });

これがメタ情報の問題に対する優れた解決策だとは本当に思いませんが、これは私が Ember-Data で思いついた最善の解決策です。たぶん、これは将来簡単になるでしょう。

于 2013-08-15T10:03:34.813 に答える
6

応答で渡されたメタ情報にアクセスする方法を見つけました。しかし、残念ながら、それは実際には ember-data によってサポートされているようには見えず、メタ情報をグローバル変数に書き込んでおり、要求元のコントローラーでバインドを介してアクセスしています。

RESTAdapter が使用しているシリアライザーをカスタマイズすることになりました。

App.CustomRESTSerializer = DS.RESTSerializer.extend({
  extractMeta: function(loader, type, json) {
    var meta;
    meta = json[this.configOption(type, 'meta')];
    if (!meta) { return; }
    Ember.set('App.metaDataForLastRequest', meta);
    this._super(loader, type, json);
  }
});

App.Store = DS.Store.extend({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    bulkCommit: false,
    serializer: App.CustomRESTSerializer
  })
});

私はこれが特にきれいではないことを認識しており、実際にはこれは ember-data が私たちに期待していることに反していると思いますが、当面は正しく機能しています。

私はこれをより良い方法で ember-data で動作させ、動作しているときにプルリクエストを送信するか、他の誰かがこれを動作させることに興味を持っているときに github で問題を開こうとします。

誰かがこれに対するよりクリーンな解決策を見つけたら、私に知らせてください。

于 2013-01-16T11:31:33.297 に答える
2

すぐに修正できるのは、totalCountをモデル(recordArray)にアタッチすることだと思います。このスレッドを参照してください。

もう1つの方法は、独自のアダプターを作成することです。

DS.Adapter.create({
  find: function (store, type, id) {
    $.ajax({
      url:      type.url,
      dataType: 'jsonp',
      context:  store,
      success:  function(response){
        this.load(type, id, response.data);
      }
    });
  },
  findAll: function(store, type) {
    $.ajax({
      url:      type.url,
      dataType: 'jsonp',
      context:  store,
      success:  function(response){
        this.loadMany(type, response.data);
      }
    });
  }
});

findAllメソッドの成功コールバックの応答パラメーターは、必要なオブジェクトである必要があります。

response: {
  meta: {
    totalCount: 10
  },
  posts: [{}, {}]
}

お役に立てれば。

于 2013-02-16T15:50:00.400 に答える