I'm using the MEAN stack (Angular 6) and I'm still looking for the best way to build a custom and reusable <select>
form control which uses an Array of strings returned from the BE to generate all <option>
tags. Let's say for example we have 3 materials wood
, metal
and plastic
and the returned Array can be one of the following (stored in the materials
variable):
(in my example.component.ts)
form = new FormGroup({
'material' = new FormControl('')
});
get material() {return this.form.get('material');}
materials = [
{
key: "mat_wood",
value: "Wood"
},
{
key: "mat_metal",
value: "Metal"
},
{
key: "mat_plastic",
value: "Plastic"
}
]
or
(in my example.component.ts)
form = new FormGroup({
'material' = new FormControl('')
});
get material() {return this.form.get('material');}
materials = [
{"mat_wood": "Wood"},
{"mat_metal": "Metal"},
{"mat_plastic": "Plastic"}
]
and we have this HTML structure:
(in my example.component.html)
<form [formGroup]="form">
<div class="select-wrap">
<span class="select-value">{{}}</span>
<select formControlName="material">
<option *ngFor="let mat of materials" value="{{}}">{{}}</option>
</select>
</div>
</form>
Which eventually has to be compiled to this:
<select formControlName="material">
<option value="mat_wood">Wood</option>
<option value="mat_metal">Metal</option>
<option value="mat_plastic">Plastic</option>
</select>
Here we have a classical example of a custom select structure. The <span class="select-value">
displays the selected option's text to the user. The <select>
has opacity
set to 0
and is positioned on top of the <span>
, so when the user clicks, he clicks on it and activates it.
For each option I need to put the mat_[something]
in the value
attribute and the readable Something
as text in the option, just like in the example above:
<option value="mat_wood">Wood</option>
.
Question is: How can I put the selected option text inside the <span>
? I'm looking for a reusable way of doing it.
EDIT:
Looking at the first answer shows (and I forgot to mention) that using a template variable does the job. But if we have an enclosing *ngFor loop that generates multiple selects, then we need to have dynamically generated template variables. Is that even possible?