我正在尝试创建一个来自JSON的搜索。我已经看过一些教程,教我如何做这件事,我用他们的例子来教它:
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响应结构的一个示例:
{
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我试着想出一种将承诺转换为数组的方法,这样我就可以运行过滤器函数,但什么也没有得到。怎样才能达到我想要做的事情呢?
发布于 2015-04-25 05:12:14
你不能把承诺“转换”成数组。承诺是一个承诺对象,可能会在某一时刻实现(如果还没有实现的话)。它们可以异步返回结果。
所以当你有了台词:
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)位;)
https://stackoverflow.com/questions/29860575
复制相似问题