Angular2 formControl用于选择多个

Posted

技术标签:

【中文标题】Angular2 formControl用于选择多个【英文标题】:Angular2 formControl for select multiple 【发布时间】:2017-02-11 14:24:21 【问题描述】:

我正在使用 Sematinc-UI 和 Angular2 ReactiveFormsModule 表单,我想使用 [formControl] 进行多选。

如果我使用select,它可以正常工作:

        <select class="ui fluid dropdown" [formControl]="myForm.controls.category">
            <option *ngFor="let item of categories" value="item">item</option>
        </select>

如果我使用选择多个它不起作用:

        <select multiple="" class="ui fluid dropdown" [formControl]="myForm.controls.category">
            <option *ngFor="let item of categories" value="item">item</option>
        </select>

我收到此错误:

core.umd.js:3462 例外:未捕获(在承诺中):错误:http://localhost:3000/app/components/category.component.js 类 CategoryComponent 中的错误 - 内联模板:0:1701 导致:values.map 不是函数

可能是什么问题?

【问题讨论】:

category.component.js(和.ts)中说 values.map 不是函数的地方是什么? 我没有values 变量,也没有在.js 文件中,也没有在.ts 文件中。 我发现了同样的问题。我构建了 FormBuilder 组,当我添加 'courseIds': [1,3,5] (其中 courseIds 是多选)时,它抱怨“this.validator 不是函数”。如果我传入'courseIds': value: [1,3,5],我会得到“values.map 不是函数”,因为它现在已将整个对象作为值而不是数组传递。您应该如何将多个值传递给 FormControl 构造函数? 【参考方案1】:

我为我的 ionic 项目尝试了 Daniel 的答案,它确实有效。如果有人在看,这是一个示例

buildForm() 
    this.registerForm = this.formBuilder.group(
      'contact': ['03007654321', [Validators.required]],
      'agree': [true, Validators.requiredTrue],
      'categories': this.formBuilder.array([]),
      'locations': [[], Validators.required],
    );
  

在你的 html 模板中像这样使用它

<ion-item  >
      <ion-label>Gender</ion-label>
      <ion-select multiple="true" [formControl]="registerForm.controls.locations">
        <ion-option value="f">Female</ion-option>
        <ion-option value="m">Male</ion-option>
      </ion-select>
    </ion-item>

注意:我在 ionic on ion-select 中使用它,但我猜它会 也可以使用常规 HTML select()。

【讨论】:

【参考方案2】:

在 ionic2 和反应形式中工作,我能够仅使用验证器“必需”来验证多项选择,minlength() 不起作用。如果您不想通过验证,则需要将 null 传递给模型。空数组将通过“必需”验证。如果你问我有点奇怪。

【讨论】:

【参考方案3】:

我让它工作了。诀窍是确保该值始终是一个数组,即使没有选择任何内容。

<select multiple class="ui fluid dropdown" [formControl]="myForm.controls.category">
    <option *ngFor="let item of categories" [ngValue]="item">item</option>
</select>

创建FormControl 时,确保空白 值是一个空数组,而不是''undefined

this.control = new FormControl([]);

我没有使用 Semantic-UI,只是标准的 Angular 2

【讨论】:

您使用什么验证规则?不能让它工作。 我不记得了,但我的示例没有显示验证规则 - 你尝试过没有验证规则吗?【参考方案4】:

查看 FormControl (https://github.com/angular/angular/blob/master/modules/%40angular/forms/test/form_control_spec.ts) 的测试很明显,如果您传入一个数组,那么第二个和后续值将被视为验证器(因此我在上面的评论中出现了第一个错误)。要传入一个数组,它必须是“装箱”(在一个对象内),但 FormControl 需要“禁用”属性才能使用“值”属性作为值,所以最后正确的格式是'courseIds': value: [1,3,5], disabled: false .

【讨论】:

以上是关于Angular2 formControl用于选择多个的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Angular2 FormControl 对象中获取输入字段的名称?

Angular2 - FormControl 验证模糊

无法绑定到“formControl”,因为它不是“输入”的已知属性 - Angular2 Material Autocomplete 问题

包含一个组件作为 FormControl Angular2

Angular 2 - 订阅 FormControl 的 valueChanges 是不是需要取消订阅?

angular2 复选框表单控件