我正在尝试通过调用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
序列化程序,但不知道该写些什么。或者也许还有其他因素导致了这一点。看起来我应该工作正常,但事实并非如此。有什么建议吗?
答案 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
};
});
},