从非默认REST API中检索计数(总计)

时间:2015-01-25 10:23:01

标签: ember.js ember-data ember-cli

我想使用Ember在我的服务器上查询此网址http://localhost:1337/api/posts/count?category=technology。我使用默认的RESTAdapter,如下所示:

export default DS.RESTAdapter.extend({
  coalesceFindRequests: true,
  namespace: 'api',
)};

Post模型如下所示:

import DS from 'ember-data';

var Post = DS.Model.extend({
  title: DS.attr('string'),
  permalink: DS.attr('string'),
  body: DS.attr('string')
});

export default Post;

我如何提出这样的要求?

1 个答案:

答案 0 :(得分:3)

我认为当您无法控制后端时,至少有两种方法可以实现这一目标。否则,您仍然可以使用RESTful API(请参阅我的答案的最后一部分)。

覆盖buildURL

第一个是使用现有的RESTAdapter功能,只覆盖buildURL方法:

var PostAdapter = DS.RESTAdapter.extend({
  namespace: 'api',

  buildURL: function(type, id, record) {
    var originalUrl = this._super(type, id, record);
    if (this._isCount(type, id, record))  { // _isCount is your custom method
      return originalUrl + '/count';
    }
    return originalUrl;
  }
});

您在_isCount方法中的位置(例如根据record属性)是否符合您的要求。然后,您可以使用商店传递参数:

this.store.find('post', {
  category: technology
});

覆盖findQuery

第二种方法是覆盖整个findQuery方法。您可以使用上述DS.RESTAdapter或仅使用DS.Adapter。代码如下所示:

var PostAdapter = DS.Adapter.extend({
  namespace: 'api',

  findQuery: function(store, type, query) {
    // url be built smarter, I left it for readability
    var url = '/api/posts/count';

    return new Ember.RSVP.Promise(function(resolve, reject) {
      Ember.$.getJSON(url, query).then(function(data) {
        Ember.run(null, resolve, data);
      }, function(jqXHR) {
        jqXHR.then = null;
        Ember.run(null, reject, jqXHR);
      });
    });
  },

});

并且您也使用上一个示例中的商店:

this.store.find('post', {
  category: technology
});

获取'计数'来自meta

如果您对后端有完全控制权,则可以利用metadata的强大功能。

服务器响应将是:

// GET /api/posts/:id
{
  "post": {
    "id": "my-id",
    "title": "My title",
    "permalink": "My permalink",
    "body": "My body"
  },

  "meta": {
    "total": 100
  }
} 

然后您可以从以下位置获取所有元信息:

this.store.metadataFor("post");

同样,您可以在获取/api/posts的所有帖子时使用此方法。

我希望它有所帮助!