2017-02-17 48 views
1

我正在研究如何用打字稿过滤带Angular 2中数据的数组。过滤是针对Ionic 2中的搜索栏,模板中的列表正在获取数据并显示,但过滤不起作用。在角度2打字稿中过滤数组

initializeItems(i:number) { 
this.http.get('https://maps.googleapis.com/maps/api/place/details/json?placeid='+this.placeid+'&key=AIzaSyBPi-ayuvkTht4wddCcvcy0l2wIBdT9P2w').map(res => res.json()).subscribe(data => { 
    this.locations[i]._detail = data.result; 

    this.names.push([ 
    { 
     name: this.locations[i]._detail.name, 
     adress: this.locations[i]._detail.formatted_address, 
     phone: this.locations[i]._detail.formatted_phone_number 
    } 
    ]); 

    this.items = this.names; 
    console.log(this.items); 
}); 
} 

getItems(ev) { 
    this.items = this.names; 
    console.log(this.items); 
    // set val to the value of the ev target 
    var val = ev.target.value; 

    // if the value is an empty string don't filter the items 
    if (val && val.trim() != '') { 
    this.items = this.items.filter((item) => { 
     return (item.name.toLowerCase().indexOf(val.toLowerCase()) > -1); 
    }) 
    } 
} 

当我在搜索栏键入我得到这个错误。

enter image description here

+0

用户被假定'item.name'指字符串。你对此有多确定? – Leon

+0

item.name是一个字符串,但我不知道如何在过滤器中访问它? – Mohammed

+0

你可以尝试用'let'声明'val'吗?即'let val = ev.target.value;' – AngularChef

回答

0

我想你申请push错误。将对象推入数组而不是另一个数组。如果您有多个名称,请使用spread运营商

this.names.push(
    { 
     name: this.locations[i]._detail.name, 
     adress: this.locations[i]._detail.formatted_address, 
     phone: this.locations[i]._detail.formatted_phone_number 
    } 
); 
+0

我该如何使用spread运算符?我是新的角2和打字稿。 – Mohammed

+0

您是否尝试过上述更改?这应该工作。 – raj

+0

了解传播运营商签出此文档。有了这个,你可以将数组的所有元素推送到另一个数组'array.push(... anotherArray)''。它是一个JS运算符。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator – raj

2

我找到了解决方案。

  1. 改变了键为字符串对象中的
  2. 加入[0]中返回语句
  3. 阵列改为orginames并设定项目= orginames,这确保了该阵列将不会是空的,如果你搜索并再次删除该单词。

initializeItems(i:number) { 
this.http.get('https://maps.googleapis.com/maps/api/place/details/json?placeid='+this.placeid+'&key=AIzaSyBPi-ayuvkTht4wddCcvcy0l2wIBdT9P2w').map(res => res.json()).subscribe(data => { 
    this.locations[i]._detail = data.result; 


    this.orginames.push([ 
    { 
     "name": this.locations[i]._detail.name, 
     "adress": this.locations[i]._detail.formatted_address, 
     "phone": this.locations[i]._detail.formatted_phone_number 
    } 
    ]); 

    this.items = this.orginames; 
    // this.orginames.push(this.locations[i]._detail.name); 

}); 
console.log(this.items); 

} 

getItems(ev) { 
    this.items = this.orginames; 
    //console.log(this.items); 
    // set val to the value of the ev target 
    var val = ev.target.value; 

    // if the value is an empty string don't filter the items 
    if (val && val.trim() != '') { 
    this.items = this.items.filter((item) => { 
     return (item[0].name.toLowerCase().indexOf(val.toLowerCase()) > -1); 
    }) 
    } 
}