我正在为成员编写一个简单的过滤器“搜索”功能。我有2个数组属性,一个是members
,这是所有成员的列表,另一个是filteredMembers
,这是成员的过滤后的列表:
getMembers() {
return this.userService.getMembers(this.authUser.selectedCompany).then(data => {
if (data.statusCode === 200) {
this.members = data.content.users.sort(function (a, b) {
if (a.firstName < b.firstName) return -1;
if (a.firstName > b.firstName) return 1;
return 0;
});
this.filteredMembers = this.members;
}
}).catch(err => {
console.log('error getting members:', err.response);
});
}
由于尚未进行任何过滤,因此我只将
filteredMembers
设置为等于members
。到目前为止,一切都很好。现在,我可以进行带有keyup事件的输入搜索,该事件可以根据我在搜索框中输入的内容过滤成员:
<input type="search" value.bind="searchQuery" keyup.delegate="filterMembers()">
和功能:
filterMembers() {
if(!this.searchQuery) {
this.filteredMembers = this.members;
return;
}
let filteredCount = this.filteredMembers.length;
for (var i = 0; i < filteredCount; i++) {
if (this.filteredMembers[i].lastName.toLowerCase().indexOf(this.searchQuery.toLowerCase()) == -1) {
this.filteredMembers.splice(i, 1);
}
}
}
因此,您可以在函数中看到,我只是检查是否在成员的姓氏中找不到用户在搜索框中键入的内容,然后从
filteredMembers
数组中删除该成员。如果搜索查询为空,则再次使filteredMembers
等于members
。这是我出于某种原因遇到的问题,可能是
Aurelia
中的错误,也可能是人为错误,但是当我从filteredMembers
中删除元素时,它也在从members
数组中删除它。我尝试了各种变体,例如在该初始filteredMembers
函数中不将members
设置为等于getMembers()
。 最佳答案
如果filteredMembers
和members
是相同的数组实例,则元素删除将反映在这两个属性中,因为这两个属性都是对同一数组实例的引用。
将members
数组浅克隆后再将其分配给filteredMembers
。
更改此:
if(!this.searchQuery) {
this.filteredMembers = this.members;
return;
}
对此:
if(!this.searchQuery) {
this.filteredMembers = this.members.slice(0);
return;
}