Ember Data未将参数附加到查询中。

4
Ember数据只是不会将参数附加到查询中。我有一个像这样的标签路由

example

App.TagsRoute = Ember.Route.extend({
 model: function(params) {
    var tag = params.tag_name;
    var entries = this.store.find('entry', {tags: tag});
    return entries;
 }
});

但是这会使得相同的请求不断发出,就像这个代码:this.store.find('entry')。

编辑:

我的路由器看起来像这样:

App.Router.map(function(){
 this.resource('entries', function(){
  this.resource('entry', { path: '/entry/:entry_id/:entry_title' });
 });
 this.route('tags', { path: '/t/:tag_name' });
});

当我请求(例如)localhost:8888/#/t/tag时,params.tag_name的值为“tag”。

编辑2:

我的REST适配器

App.ApplicationAdapter = DS.RESTAdapter.extend({
    bulkCommit: false,
    buildURL: function(record, suffix) {
      var s = this._super(record, suffix);
      return s + ".json";
    },
    findQuery: function(store, type, query) {
      var url = this.buildURL(type.typeKey), 
      proc = 'GET', 
      obj = { data: query },
      theFinalQuery = url + "?" + $.param(query);
      console.log(url); // this is the base url
      console.log(proc); // this is the procedure
      console.log(obj); // an object sent down to attach to the ajax request
      console.log(theFinalQuery); // what the query looks like
      // use the default rest adapter implementation
      return this._super(store, type, query);
    }
 });

编辑3:

对我的TagsRoute对象进行一些更改后,我得到了以下输出:

App.TagsRoute = Ember.Route.extend({
 model: function(params) {
    var tag = params.tag_name;
    var query = {tags: tag};
    console.log(query);
    var entries = this.store.find('entry', query);
    return entries;
 }
});


当我请求localhost:8888/#/t/tag时,控制台输出如下:

Object {tags: "tag"}
(主机网址)+ api/v1/entries.json
GET
Object {data: Object}
(主机网址)+ api/v1/entries.json?tags=tag
Class {type: function, query: Object, store: Class, isLoaded: true, meta: Object…}

Ember数据正在附加GET参数。我认为我的错误可能是所请求的网址,应该像这样:
(主机网址) + api/v1/tags/:tag_name.json
而不是
(主机网址) + api/v1/entries.json?tags=:tag_name

解决方法:

Ember Data的版本有问题(ember-data 1.0.0-beta.3-16-g2205566)。当我将脚本src更改为builds.emberjs.com.s3.amazonaws.com/canary/daily/20131018/ember-data.js时,一切正常工作。
添加GET参数的正确方式是:

var query = {param: value};
var array = this.store.find('model', query);

感谢您的帮助。

发送的请求是什么? - Kingpin2k
2个回答

1
你做的一切都是正确的,你确定发送回服务器的请求不包含查询吗?
完整的查询直到JQuery调用后才创建。
你是否查看了Chrome(或其他浏览器)中的网络选项卡,以查看它发送了什么。
请观察下面jsbin中的控制台,它显示了使用对象(用于查询)进行查找时会发生什么。
App.MyAdapter = DS.RESTAdapter.extend({
 findQuery: function(store, type, query) {
    var url = this.buildURL(type.typeKey), 
        proc = 'GET', 
        obj = { data: query },
        theFinalQuery = url + "?" + $.param(query);
    console.log(url); // this is the base url
    console.log(proc); // this is the procedure
    console.log(obj); // an object sent down to attach to the ajax request
    console.log(theFinalQuery); // what the query looks like
    // use the default rest adapter implementation
    return this._super(store, type, query);
  },
});

http://emberjs.jsbin.com/AyaVakE/1/edit

额外问题:

点击:http://localhost:8888/#/t/tag 会触发标签路由,将'tag'发送到tag_name。你的模型钩子是正确的。你在哪里看到请求是相同的?

此外,你提到了store.find('entries)和store.find('entry')。我知道它们处理大多数事物的复数形式,但你应该确保它们最终成为相同的端点/api/entries。


如果您添加并使用我上面展示的适配器,然后使用它代替原来的适配器,在控制台中会输出什么? - Kingpin2k
我使用了新的REST适配器进行编辑。控制台没有输出任何内容。 - Camilo
你会在模型钩子的查找请求中提取对象,就像这样,并将其输出到控制台。 var tag = params.tag_name; var query = { tags: tag }; console.log(query); var entries = this.store.find('entry', query); - Kingpin2k
你保存了吗?我没有看到任何更改。 - Kingpin2k
我对Ruby不熟悉,但听起来问题在于您的后端与Ember Data标准的端点不匹配。 Ember Data的标准是/type/id或/type?param=value。 - Kingpin2k
显示剩余11条评论

0

RESTAdapter 通过将查询对象附加到设置对象的 data 属性上,将其发送到 jQuery.ajax() 方法中。 (有关设置对象的详细信息,请参见 此处。)

看起来可能未定义标记名称。请确保 tag_name 参数正确来自您的路由。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接