I have a form with various select boxes which use objects as the value:
<mat-option [value]="object">
Which works great when I am creating new records via the form. Now when I am editing records, I run into the problem that the object
in the mat-select-option
is not the "same" object that I get from my rest service, so my select boxes have no option selected when editing the record.
Is it possible to tell the select-box widget to match on object.id
when deciding what option is selected? I think I may need to write a directive to handle this, but maybe this is already possible with Angular or Angular Material libraries, or another existing solution.
To elaborate I have my foo.component.ts
file:
let item = {
'fruit': { id: 1, 'label': 'Pineapple' },
}
let options = [
{ 'id':1, 'label': 'Pineapple' },
{ 'id':2, 'label': 'Banana' },
{ 'id':3, 'label': 'Papaya' }
]
And my .html
file:
<mat-select placeholder="Fruit" [(ngModel)]="item.fruit">
<mat-option *ngFor="let option of options" [value]="option">{{option.label}}</mat-option>
</mat-select>
When the user visits the page, they should see "Pineapple" selected in the mat-select
. Because the 'pineapple' in the item.fruit
and the options
array are not pointing to the same 'pineapple' object - the mat-select
is empty.
I'd like to see something like:
<mat-select
placeholder="Fruit"
[(ngModel)]="item.fruit"
equalityAttr="id"
>
Using NgModel Directive Angular has another way to get the selected value in the dropdown using the power of ngModel and two-way data binding. The ngModel is part of the forms module. We need to import it into the NgModule list in the app. module , which will be available in our app.
STEP 1 − Create a select tag with multiple options and assign an id to the select tag. STEP 2 − Also, create an empty DOM with an id to display the output. STEP 3 − Let there be a button element for the user to click and see the option selected. STEP 4 − Let the user select an option from the dropdown list.
Use unique identifiers as values for dropdown options, which in your case is category ids. Now pass the category id from the portal object to ngModel directive to bind the value to dropdown. You can use ngModelChange directive to listen for category id value changes and update the same in portal object.
It is the [compareWith]
directive. Angular.io is down at the moment, so I will ink to this medium article for reference.
HTML
<mat-select
placeholder="Fruit"
[(ngModel)]="item.fruit"
[compareWith]="objectComparisonFunction">
<mat-option *ngFor="let option of options" [value]="option">{{option.label}}</mat-option>
</mat-select>
TypeScript
public objectComparisonFunction = function( option, value ) : boolean {
return option.id === value.id;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With