4

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

例子

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"}
(host url) + api/v1/entries.json
GET
Object {data: Object}
(host url) + api/v1/entries.json?tags=tag
Class {type: function, query : Object, store: Class, isLoaded: true, meta: Object...}

Ember 数据附加 GET 参数。我认为我的错误可能是请求的 url,它应该是这样的
(host url) + api/v1/tags/:tag_name.json
而不是
(host url) + 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);

感谢您的帮助

4

2 回答 2

1

您所做的一切都是正确的,您确定发送回服务器的请求不包含查询吗?

在 JQuery 进行调用之前,不会创建完整的查询。

您是否查看了 chrome(或您使用的任何浏览器)中的网络选项卡以查看它发回的内容。

观察下面 jsbin 中的控制台,它显示了当您将 find 用于对象(用于查询)时会发生什么:

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

附加问题:

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

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

于 2013-10-19T17:32:07.637 回答
0

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

看起来标签名称可能没有定义。尝试确保tag_name参数正确来自您的路线。

于 2013-10-19T15:15:17.550 回答