在Angular中进行自定义选择的最佳方法?

时间:2019-01-04 10:03:42

标签: javascript angular typescript html-select

我正在使用MEAN堆栈(角度6),但我仍在寻找构建自定义和可重用的<select>表单控件的最佳方法,该控件使用从BE返回的字符串数组生成所有<option>个标签。例如,假设我们有3种材料woodmetalplastic,并且返回的Array可以是以下之一(存储在materials变量中):

(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"
  }
]

(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"}
]

,我们具有以下HTML结构:

(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>

最终必须对此进行编译:

  <select formControlName="material">
    <option value="mat_wood">Wood</option>
    <option value="mat_metal">Metal</option>
    <option value="mat_plastic">Plastic</option>
  </select>

在这里,我们有一个自定义选择结构的经典示例。 <span class="select-value">向用户显示所选选项的文本。 <select>的{​​{1}}设置为opacity,并且位于0的顶部,因此,当用户单击时,他单击并激活了它。

对于每个选项,我都需要将<span>放在mat_[something]属性中,并将可读的value作为文本放在选项中,就像上面的示例一样:
Something

问题是:如何将所选的选项文本放在<option value="mat_wood">Wood</option>中?我正在寻找一种可重用的方式。


编辑
查看第一个答案可知(我忘了提及),使用模板变量即可完成工作。但是,如果有一个封闭的* ngFor循环生成多个选择,那么我们需要动态生成模板变量。那有可能吗?

2 个答案:

答案 0 :(得分:2)

一种方法是您可以将选择mySelect称为选择模板变量。

<select #mySelect formControlName="material">
  <option value="mat_wood">Wood</option>
  <option value="mat_metal">Metal</option>
  <option value="mat_plastic">Plastic</option>
</select>

并像这样引用其options.text属性。 {{ mySelect && mySelect.selectedIndex > -1 ? mySelect.options[mySelect.selectedIndex].text : ''}}在span元素中。

您可以了解模板变量here

答案 1 :(得分:0)

尝试以下示例以了解动态选项

以HTML格式

<mat-form-field>
  <mat-select placeholder="Select"    [(value)]="selected">
    <mat-option *ngFor="let data of materials" [value]="getKey(data)">{{getValue(data)}}</mat-option>
  </mat-select>
</mat-form-field>

<p>You selected: {{selected}}</p>

在TS

@Component({
  selector: 'select-value-binding-example',
  templateUrl: 'select-value-binding-example.html',
  styleUrls: ['select-value-binding-example.css'],
})
export class SelectValueBindingExample {
  selected = 'option2';
  materials = [
  {"mat_wood": "Wood"},
  {"mat_metal": "Metal"},
  {"mat_plastic": "Plastic"}
]
getValue(obj)
{
return obj[Object.keys(obj)[0]]
}
getKey(obj)
{
return Object.keys(obj)[0]
}
checkValue()
{
 console.log( this["mySelect"])
}
}