私はmat-autocomplete
ウィジェットを使用していますAngular app:
<mat-form-field class="col-md-3" color="warn">
<input type="text"
id="libelleShop"
#inputSelectShop
placeholder="Selectionner la boutique"
matInput
formControlName="libelleShop"
ngDefaultControl
[matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete""
(optionSelected)="onShopSelectionChanged($event)">
<mat-option *ngFor="let shop of shopData" [value]="shop.value">
{{shop.name}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
私のショップのデータは次のとおりです:
shopData = [
{name: 'AAA' , value :'11'},
{name: 'BBB', value :'22'},
{name: 'CCC', value : '33'}
];
このように-オプションはname
によって表示されますが、選択すると、入力はvalue
ではなくname
によって表示されます。
他の治療のために値が必要であることを知っていて、[value]
のmat-automplete
を変更しません。
名前の入力をどのように参照できますか?
提案??
Mat autocompleteのdisplayWith属性を使用して、目的のフォーマットされた文字列を返す関数を渡すことができます。
あなたの例では:
displayFn(shop: Shop): string {
return shop.name;
}
<mat-autocomplete #auto="matAutocomplete"" (optionSelected)="onShopSelectionChanged($event)" [displayWith]="displayFn">
<mat-option *ngFor="let shop of shopData" [value]="shop.value">
{{shop.name}}
</mat-option>
</mat-autocomplete>
オプションidを使用する簡単な方法は便利かもしれません:
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="onShopSelectionChanged($event)">
<mat-option *ngFor="let shop of shopData" [value]="shop.name" [id]="shop.value">
{{shop.name}}
</mat-option>
</mat-autocomplete>
関数の値と名前を読み取ります:
onShopSelectionChanged(event) {
const selectedValue = event.option.id;
console.log(selectedValue);
const selectedName = event.option.value;
console.log(selectedName);
}
変更したくないので[value]="shop.value"
、あなたの唯一の手段は、displayWith
機能で使用される関数の値に基づいて名前を検索することです:
<mat-autocomplete ... [displayWith]="getShopName" ... >
getShopName(value) {
const results = this.shopData.filter(shop => shop.value === value);
if (results.length) {
return results[0].name;
}
return value;
}
モデル 'shopData'で、 'value'または ':'の後に ':'文字を追加します。
export interface Shop {
name: string;
value: number;
}
shopData: Shop[] = [
{name: 'AAA' , value: 11},
{name: 'BBB', value: 22},
{name: 'CCC', value: 33}
];
FormControl
タグでinput
を使用し、patchValue
メソッドを使用してこのform-control
の値を変更できます。
(onSelectionChange)="onEnter($event)"
を使用して、選択された値を使用してselectedArrayオプションを見つけ、その選択されたオプションオブジェクトから、任意のオプションキーで入力の値を更新します。
HTML:
<form class="example-form">
<mat-form-field class="example-full-width">
<input #stateInput (keyup)="0" matInput placeholder="State"
aria-label="State" [matAutocomplete]="auto" [formControl]="stateCtrl">
<mat-autocomplete #auto="matAutocomplete">
<mat-option (onSelectionChange)="stateInput.value !=undefined &&
onEnter($event)" *ngFor="let state of filteredStates | async"
[value]="state.name">
<img style="vertical-align:middle;" aria-hidden
src="{{state.flag}}" height="25" />
<span>{{ state.name }}</span> |
<small>Population: {{state.population}}</small>
</mat-option>
</mat-autocomplete>
</mat-form-field>
Tsファイル:
onEnter(evt: any){
const selectedState = this.states.find(state =>
state.name.toLowerCase()==evt.source.value.toLowerCase());
if (evt.source.selected) {
console.log(selectedState);
if(selectedState) {
setTimeout(()=>{
this.stateCtrl.patchValue(selectedState.population);
}, 0);
}
}
}