Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js async hasMany中的查询参数通过链接_Ember.js_Ember Data - Fatal编程技术网

Ember.js async hasMany中的查询参数通过链接

Ember.js async hasMany中的查询参数通过链接,ember.js,ember-data,Ember.js,Ember Data,使用余烬数据,您可以执行以下操作: App.Post = DS.Model.extend({ comments: DS.hasMany('comment', {async:true}) }); 通过链接-对象,您可以从服务器返回或序列化负载客户端,如下所示: { post:{ id: 1, links: { comments: 'comments' } } } 当您执行post.get('comments') 但是我得到了很多评论,我想把查询

使用余烬数据,您可以执行以下操作:

App.Post = DS.Model.extend({
   comments: DS.hasMany('comment', {async:true})
});
通过
链接
-对象,您可以从服务器返回或序列化负载客户端,如下所示:

{
  post:{
    id: 1,
    links: {
      comments: 'comments'
    }
  }
}
当您执行
post.get('comments')

但是我得到了很多评论,我想把查询参数传递给它(就像在余烬数据中的普通搜索一样):
post.get('comments',{from:'2014-01-01',to:'2014-01-07')

不幸的是,它不起作用。还有别的办法吗


另请参见我的另一个

实现这一点的方法有很多,我将列出所有方法,然后再决定哪种方法最好

更改从服务器返回的json(可能是最正确的) 例如:

在收到json时修改序列化程序中的json 例如:

在某些情况下,修改适配器中的请求以包含额外信息
示例:

我必须解决这个问题。我找不到一个干净的解决方案,看着Ember Data的源代码,我无法想象有更好的解决方案。也许这会帮助其他人


给定这样的关系,并且需要传递查询参数来告诉API需要返回哪些注释(例如,需要包含“搜索”参数或“页码”/“页面大小”以进行分页)


我在hasMany属性的options对象中添加了一个键“params”。该值告诉适配器还有哪些模型属性包含与hasMany关系相关的参数。(请注意,“对象”不是默认的数据属性类型,请参见添加该类型。)

修改模型以提供查询参数后,我们需要适配器来使用信息:

App.ApplicationAdapter = DS.RESTAdapter.extend({
  findHasMany: function(store, snapshot, url, relationship) {
    var id   = snapshot.id;
    var type = snapshot.typeKey;

    url = this.urlPrefix(url, this.buildURL(type, id));

    if ('params' in relationship.options) {
      var params = snapshot.attr(relationship.options.params);
      if (params && Em.keys(params).length) {
        var queryParams = [];
        _.forEach(params, function (value, key) {
          queryParams.push(
            '%@=%@'.fmt(encodeURIComponent(key), encodeURIComponent(value))
          );
        });
        url = url + '?' + queryParams.join('&');
      }
    }

    return this.ajax(url, 'GET');
  },
});
现在,您可以使用路由/控制器中的操作或控制器中的观察者来修改params属性,然后对hasMany属性调用get()或reload():

  // some controller ...
  // assume a template with binding to 'query'
  queryDidChange: function() {
    var model = this.get('model');
    var params = model.getWithDefault('comment_params', {});

    var value = this.get('query').trim();
    if (value !== '') {
      params['search'] = value;
    } else {
      delete params['search'];
    }
    model.set('comment_params', params);
    // calling reload to get a new set of comments
    // if comments have not been loaded yet only the 'get' is
    // necessary.
    model.get('comments').reload();
  }.observes('query'),

社论: 我真的希望我不需要添加所有这些代码,但是似乎返回hasMany的所有记录是默认的,没有现成的方法来修改它


编辑#2:我使用lodash中的“_.forEach”。你也可以使用

Object.keys(params).forEach($same_foreach_function_as_above)

我已经编写了一个插件来实现这一点:

安装和配置后,您应该能够查询:


post.query('comments',{from'2014-01-01',to'2014-01-07'})

感谢您提供的所有选项,我意识到将注释映射为
具有许多
-关系不是正确的方法,因为我需要在服务器上查询它。我应该为我的另一个问题寻找另一个解决方案。我接受这个答案,因为从技术上讲,你确实回答了我的问题。@Kingpin2k,我问了同样的问题,这个答案的问题是你给出了示例
foo=bar
,但我需要动态地传递参数,不仅仅是
bar
,还需要分页:
foo=page1
foo=page2
,等等,你能回答我的问题吗。
App.Post = DS.Model.extend({
  comments: DS.hasMany('comment', {async:true})
});
App.Post = DS.Model.extend({
  comments: DS.hasMany('comment', {async:true, params: 'comment_params'}),
  comment_params: DS.attr('object'),
});
App.ApplicationAdapter = DS.RESTAdapter.extend({
  findHasMany: function(store, snapshot, url, relationship) {
    var id   = snapshot.id;
    var type = snapshot.typeKey;

    url = this.urlPrefix(url, this.buildURL(type, id));

    if ('params' in relationship.options) {
      var params = snapshot.attr(relationship.options.params);
      if (params && Em.keys(params).length) {
        var queryParams = [];
        _.forEach(params, function (value, key) {
          queryParams.push(
            '%@=%@'.fmt(encodeURIComponent(key), encodeURIComponent(value))
          );
        });
        url = url + '?' + queryParams.join('&');
      }
    }

    return this.ajax(url, 'GET');
  },
});
  // some controller ...
  // assume a template with binding to 'query'
  queryDidChange: function() {
    var model = this.get('model');
    var params = model.getWithDefault('comment_params', {});

    var value = this.get('query').trim();
    if (value !== '') {
      params['search'] = value;
    } else {
      delete params['search'];
    }
    model.set('comment_params', params);
    // calling reload to get a new set of comments
    // if comments have not been loaded yet only the 'get' is
    // necessary.
    model.get('comments').reload();
  }.observes('query'),
Object.keys(params).forEach($same_foreach_function_as_above)