emberjs 将限制和偏移元数据放入 RESTadapter 中的 headers 中用于 findQuery

emberjs place limit and offset metadata into headers within RESTadapter for a findQuery

如何获取 offsetlimit(或与此相关的任何查询),该 find() 从路由发出,如下所示

this.store.find('person', {offset: 0, limit:10});

然后在适配器中获取这两个值以将它们推送为 headers(与 body 相对)

我正在检查 docs regarding metadata 并看到提到 this.store.metadataFor("person");

加上 docs re RESTAdapter 中提到使用注入器获取 authtoken 的示例。

App.ApplicationAdapter = DS.RESTAdapter.extend({
  headers: function() {
    return {
      "API_KEY": this.get("session.authToken"),
      "ANOTHER_HEADER": "Some header value"
    };
  }.property("session.authToken")
});

如何在模型上做类似的 'injector'(相对于 session)。

App.ApplicationAdapter = DS.RESTAdapter.extend({

   headers: function() {
      var limit = this.get("person.limit");    // injector style ??
      //var limit = this.store.metadataFor("person"); //but no ref to store
      return {"limit": limit};
   }.property("person.limit"),

"the session object has been injected into an adapter by Ember's container." 好像是神秘酱汁的一部分。

tia.

当您在 object 中传递属性以查询商店时,它们最终以 findQuery 方法结束,默认情况下如下所示(参见 here):

findQuery: function(store, type, query) {
  return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
},

query 作为请求参数传入。我猜你可以在适配器内部重写这个方法并将它们作为 headers 传递。

App.ApplicationAdapter = DS.RESTAdapter.extend({
  findQuery: function(store, type, query) {
    console.log("OFFSET: " + query.offset);
    console.log("LIMIT: " + query.limit);

    return this.ajax(this.buildURL(type.typeKey), 'GET', { headers: query });
  },
});
适配器使用的

this.ajax 方法调用 jQuery 的 ajax 方法,如您在 here. According to jQuery's documentation, you can pass in headers as an object (see here 中所见)。因此,在您的情况下,您只需将 data 替换为 headers 即可完成。

Chrome 调试器的输出确认请求 headers 确实被发送:

见下文jsbin