2017-05-29 67 views
3

我有一個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

回答

2

如果你想整個對象與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種方法之一(都是解決方法)...無論如何謝謝。 –