如何在自动完成材料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.namedisplayFn而这样一来,你就不必绑定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; 
} 

demo plunker


,如果你要绑定只state.idmd-options,你必须遍历states基于state.idstate.name并且需要这样的结合this找到。

demo plunker

+0

感谢您的回答。那么,正如我在问题中指定的那样*“顺便说一句,我仍然希望将id绑定在我的FormControl中。”*,** 1st **选项不是我想要的...我不想绑定完整的'对象'(因为后端需要'id')以我的形式发送。关于第二种方法:它不填充想要我也试图实现......在plunker我使用'国家'硬编码这种方式只用于演示的目的...在我的应用程序中,我有10个自动完成所有他们是'Observable',我没有订阅他们(我不想),所以我没有那种价值。 –

+0

@ dev_054有些比我想象的复杂。根据你的意见,也许第一个选项在这里更合适,你可以简单地检索'satet.id'。 :-) – Pengyy

+0

嗯,这里的问题是'[displayWith]'几乎不灵活...我必须选择2种方法之一(都是解决方法)...无论如何谢谢。 –