如何在自动完成材料2中使用[displayWith]显示
问题描述:
我有一个array
来自我的API,我使用Material2#AutoComplete来过滤这个...它工作到目前为止,但我有麻烦显示另一个物业而不是绑定值选项。如何在自动完成材料2中使用[displayWith]显示
我知道我必须使用displayWith
,但它并不像我期待的那样工作。函数[displayWith]="displayFn.bind(this)">
只是返回我,我怎么能得到完整的对象,因此返回函数name
。
顺便说一句,我仍然希望我的ID绑定在我的FormControl。
一些代码:
组件:
export class AutocompleteOverviewExample {
stateCtrl: FormControl;
filteredStates: any;
states = [
{
id: 1,
name: 'Alabama'
},
{
id: 2,
name: 'North Dakota'
},
{
id: 3,
name: 'Mississippi'
}
];
constructor() {
this.stateCtrl = new FormControl();
this.filteredStates = this.filterStates('');
}
onKeyUp(event: Event): void {
this.filteredStates = this.filterStates(event.target.value);
}
filterStates(val: string): Observable<any> {
let arr: any[];
console.log(val)
if (val) {
arr = this.states.filter(s => new RegExp(`^${val}`, 'gi').test(s.name));
} else {
arr = this.states;
}
// Simulates request
return Observable.of(arr);
}
displayFn(value) {
// I want to get the full object and display the name
return value;
}
}
模板:
<md-input-container>
<input mdInput placeholder="State" (keyup)="onKeyUp($event)" [mdAutocomplete]="auto" [formControl]="stateCtrl">
</md-input-container>
<md-autocomplete #auto="mdAutocomplete" [displayWith]="displayFn.bind(this)">
<md-option *ngFor="let state of filteredStates | async" [value]="state.id">
{{ state.name }}
</md-option>
</md-autocomplete>
基本上,这是几乎一样this question(不幸的是,两个答案都不正确或抛出错误)。
这是PLUNKER。
答
如果你想整个对象与md-options
进行绑定,那么你应该绑定选项与state
并返回state.name
在displayFn
而这样一来,你就不必绑定this
。
<md-autocomplete #auto="mdAutocomplete" [displayWith]="displayFn">
<md-option *ngFor="let state of filteredStates | async" [value]="state">
{{ state.name }}
</md-option>
</md-autocomplete>
displayFn(state) {
return state.name;
}
,如果你要绑定只state.id
到md-options
,你必须遍历states
基于state.id
state.name
并且需要这样的结合this
找到。
感谢您的回答。那么,正如我在问题中指定的那样*“顺便说一句,我仍然希望将id绑定在我的FormControl中。”*,** 1st **选项不是我想要的...我不想绑定完整的'对象'(因为后端需要'id')以我的形式发送。关于第二种方法:它不填充想要我也试图实现......在plunker我使用'国家'硬编码这种方式只用于演示的目的...在我的应用程序中,我有10个自动完成所有他们是'Observable',我没有订阅他们(我不想),所以我没有那种价值。 –
@ dev_054有些比我想象的复杂。根据你的意见,也许第一个选项在这里更合适,你可以简单地检索'satet.id'。 :-) – Pengyy
嗯,这里的问题是'[displayWith]'几乎不灵活...我必须选择2种方法之一(都是解决方法)...无论如何谢谢。 –