Ember:findQuery的响应必须是一个数组,而不是未定义的

时间:2015-04-09 23:49:17

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

我正在尝试通过调用API /search?q=test来实现搜索功能。 API返回以下对象:

{
    "categories" : 
    [
        {
            "id" : 77,
            "name" : "Animals",
            "output" : {}
        }, 
        {
            "id" : 167,
            "name" : "Fish",
            "output" : {
                "image" : {
                    "mimeType" : "image/png",
                    "path" : "/images/fish.png"
                }
            }
        }
    ],
    "designs" : []
    // more arrays here
}

这是我的Ember search模型:

export default DS.Model.extend({
  categories: DS.hasMany('category'),
  designs: DS.hasMany('design')
  // more hasMany relationships here
});

search控制器中:

model: function (params) {
  return this.store.find('search', { q: params.q });
}

获取此错误“断言失败:来自findQuery的响应必须是数组,而不是未定义”。

我是Ember的新手,但我觉得我还需要添加一个search序列化程序,但不知道该写些什么。或者也许还有其他因素导致了这一点。看起来我应该工作正常,但事实并非如此。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

model: function (params) {
  return this.store.find('search', { q: params.q });
}

这告诉ember-data您要查找search个对象。所以它期望数组中的那些而不是categories

您可以使用适配器上的pathForType函数指定类型的路径:

App.ApplicationAdapter = DS.RESTAdapter.extend({
  pathForType: function(type) {
    if (type == 'category') {
      return 'search';
    }
    var decamelized = Ember.String.decamelize(type);
    return Ember.String.pluralize(decamelized);
  }
});

这意味着当您提出要求时:this.store.find('category', { q: params: q });

它会向/search?q=param

发出请求

这一切都是根据文档

  

未来可能会改变

支持此rfc:https://github.com/emberjs/rfcs/pull/4,它可以让您更改特定操作的网址。

答案 1 :(得分:1)

使用给定代码,您尝试查找一些(读取:数组)搜索。答案中缺少这个,因此错误。

你真正想要的是

model: function (params) {
  return this.store.find('category', { q: params.q });
}

但这会导致向/categories?q=test提出请求。如果服务器代码和接口完全由您自己控制,请更改服务器。如果没有,您可以使用自定义的ember g adapter category方法自定义RESTAdapter(在ember-cli:pathForType中)。

答案 2 :(得分:0)

对于那些感兴趣的人,我最终使用ajax来电,而不必依赖Ember数据和模型。这是我提出的解决方案:

model: function (params) {
  var route = this;
  return Ember.$.ajax({
    url: ENV.apiHost + '/search?q=' + params.q,
    type: 'GET'
  }).then (function(result) {
    var searchObject = Ember.Object.create({
      categories: Ember.ArrayProxy.create({ content: Ember.A(result.categories) }),
      designs: Ember.ArrayProxy.create({ content: Ember.A(result.designs) }),
      // more arrays here
    });

    return {
      model: searchObject
    };
  });
},