Ember: 来自 findQuery 的响应必须是一个数组,而不是未定义的
Ember: The response from a findQuery must be an Array, not undefined
我正在尝试通过调用 API /search?q=test
来实现搜索功能。 API returns 以下对象:
{
"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 });
}
收到此错误 "Assertion Failed: The response from a findQuery must be an Array, not undefined"。
我是 Ember 的新手,但我觉得我还需要添加一个 search
序列化程序,但不确定在其中写入什么。或者也许还有其他原因导致了这种情况。在我看来它应该工作正常但事实并非如此。有什么建议吗?
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
发出请求
这一切都是根据文档
likely to change in the future
赞成此 rfc:https://github.com/emberjs/rfcs/pull/4 这将使您能够为特定操作更改 url。
使用给定的代码,您尝试找到一些(读取:一组)搜索。回复中缺少此内容,因此出现错误。
你真正想要的是
model: function (params) {
return this.store.find('category', { q: params.q });
}
但这会导致对 /categories?q=test
的请求。如果服务器代码和接口完全由您自己控制,请更改服务器。如果没有,您可以使用自定义 RESTAdapter(在 ember-cli: ember g adapter category
中)和自定义 pathForType
方法。
对于那些感兴趣的人,我最终使用了 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
};
});
},
我正在尝试通过调用 API /search?q=test
来实现搜索功能。 API returns 以下对象:
{
"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 });
}
收到此错误 "Assertion Failed: The response from a findQuery must be an Array, not undefined"。
我是 Ember 的新手,但我觉得我还需要添加一个 search
序列化程序,但不确定在其中写入什么。或者也许还有其他原因导致了这种情况。在我看来它应该工作正常但事实并非如此。有什么建议吗?
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
这一切都是根据文档
likely to change in the future
赞成此 rfc:https://github.com/emberjs/rfcs/pull/4 这将使您能够为特定操作更改 url。
使用给定的代码,您尝试找到一些(读取:一组)搜索。回复中缺少此内容,因此出现错误。
你真正想要的是
model: function (params) {
return this.store.find('category', { q: params.q });
}
但这会导致对 /categories?q=test
的请求。如果服务器代码和接口完全由您自己控制,请更改服务器。如果没有,您可以使用自定义 RESTAdapter(在 ember-cli: ember g adapter category
中)和自定义 pathForType
方法。
对于那些感兴趣的人,我最终使用了 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
};
});
},