【问题标题】:Retrieve count (total) from non-default REST API从非默认 REST API 检索计数(总数)
【发布时间】:2015-01-25 21:32:37
【问题描述】:

我想使用 Ember 向我的服务器查询此 URL 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;

我该如何提出这样的要求?

【问题讨论】:

  • 完成 :) 再次感谢。

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


【解决方案1】:

我认为当您无法控制后端时,您至少有两种方法可以实现这一目标。否则,您仍然可以使用 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 属性)是否是您想要的。然后,您可以使用 store 传递参数:

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 获取所有帖子时使用此方法。

希望对你有帮助!

【讨论】:

  • 感谢您的广泛帮助。我已经完全控制了服务器如何提供数据。有没有更好的方法通过 JSON 提供计数?
  • 感谢元数据示例。如果元数据不同(不同帖子类别的帖子计数不同)怎么办?
  • 我认为您仍然可以使用 this.store.find('post', { category: technology }),然后在后端根据您传递的查询参数 (category) 以正确的 meta.total 响应。
  • 回复也可能是:{ meta: { total: 100, technology1: 50 } }
猜你喜欢
  • 2021-09-08
  • 1970-01-01
  • 2013-10-08
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多