我正在尝试创建来自JSON API的搜索。我已经看过一些教程如何做到这一点,我让它使用他们的例子:
export default Ember.ArrayController.extend({
searchText: null,
searchResults: function(){
var searchText = this.get('searchText');
if ( ! searchText)
{
return;
}
else
{
var regex = new RegExp(searchText, 'i');
return ['hey', 'dude'].filter(function(c){
return c.match(regex);
});
}
}.property('searchText')
});
这很有效但是当我尝试做同样的承诺时我迷路了:
export default Ember.ArrayController.extend({
searchText: null,
searchResults: function(){
var searchText = this.get('searchText');
var adapter = AddressBookAdapter.create();
var companies = adapter.findAll();
if ( ! searchText)
{
return;
}
else
{
var regex = new RegExp(searchText, 'i');
return companies.filter(function(c){
return c.match(regex);
});
}
}.property('searchText')
});
这是适配器类:
export default Ember.Object.extend({
findAll: function(){
return ajax('http://localhost:8000/api/v1/address-book/companies')
.then(function(response){
return response.data;
});
}
});
这是JSON API响应结构的一个示例:
{
data: [
{
id: 6,
name: "Alexandrine Skiles",
links: [
{
rel: "self",
uri: "/api/v1/address-book/alexandrine-skiles"
}
]
},
{
id: 33,
name: "Ally Johns",
links: [
{
rel: "self",
uri: "/api/v1/address-book/ally-johns"
}
]
}
]
}
我收到此错误:
Uncaught TypeError: companies.filter is not a function
我尝试找出一种方法将一个promise转换为一个数组,这样我就可以运行过滤器功能,但却什么都没有。实现我想做的事情的正确方法是什么?
答案 0 :(得分:0)
您无法将承诺“转换”为数组。承诺是承诺对象,可以在某个时刻履行(如果尚未履行)。他们可以异步返回结果。
所以当你有这条线时:
var companies = adapter.findAll();
companies
变量是一个承诺,完成后将返回您的数据。换句话说,companies
有一个.then()
方法,你应该使用它。
所以你的ArrayController代码会变成这样:
export default Ember.ArrayController.extend({
searchText: null,
searchResults: [],
searchResultUpdater: function(){
var searchText = this.get('searchText');
var adapter = AddressBookAdapter.create();
var companies = adapter.findAll();
if ( ! searchText)
{
return;
}
else
{
var regex = new RegExp(searchText, 'i');
companies.then(function(data) {
var results = data.filter(function(c){
return c.match(regex);
});
this.set('searchResults', results);
});
}
}.property('searchText')
});
在履行承诺时设置searchResults
属性。当然,可能有更好的方法--Ember提供了很多工具。
如果您根本不打算使用结果,也可能需要在发出任何ajax请求之前执行if (!searchText)
位;)