【问题标题】:select option with default value undefined with required attribute does not work but value empty选择具有未定义默认值且必需属性的选项不起作用但值为空
【发布时间】:2019-07-01 10:30:03
【问题描述】:

我有一个国家/地区的下拉列表

<select  #countryInput  name="country" [(ngModel)]="room.countryId"   required>
  <option   [selected] [value]="undefined">Select Country</option>
  <option *ngFor="let c of countries" [value]="c.id">{{c.name}}</option>
</select>

为了“选择国家”选项,需要设置 [value]="undefined" 否则它不会显示为默认选择,而是显示为空选择。

即使标记的字段是必填字段,但在表单提交时不会显示为

<option value="">Select Country</option> 

这是 html 5 中的默认行为:

作为处理表单提交验证的一种解决方法,但这次首先验证必填字段,最后验证国家/地区字段。

if (this.room.country == undefined) {
   alert('select country ');
   return false;
}

对于带有 [value]="undefined" 的字段并显示“请先选择一个项目”警报的解决方案是什么?

查看 Daniel's 的 forked fiddle

【问题讨论】:

  • 我不明白为什么需要将值设置为 undefined?
  • 这意味着,如果你想在选择元素中显示为默认选项,选项必须具有值“未定义”
  • 您是在谈论 Angular 引入的任何特定要求吗?因为在 HTML 本身中,并没有这样的要求。
  • 抱歉造成混淆,尝试用更新的问题标题澄清
  • 你真的应该让 Angular 为你处理验证。在我提出的答案中,您的 select 表单控件将无效,只要它保持无效,您就可以显示错误消息。请记住,null !== undefinednull 是一个值,undefined 不是。

标签: angular angular2-form-validation


【解决方案1】:

我也有同样的问题,使用以下解决了我的问题

 <select class="o-field__input" [disabled]="isAnswerPresent" [(ngModel)]="inputValue" (change)="onAnswerChange()" required>
                <option [ngValue]="undefined">placeholder</option>

                <option [ngValue]="option" *ngFor="let option of optionSet;">option values</option>                     

            </select>

【讨论】:

  • 使用undefined 作为ngValue 用于option 是在使用空对象初始化select 时选择默认选项的正确方法。谢谢。
【解决方案2】:

要为您的选择设置占位符值,请将模型的状态设置为 null 并添加一个带有 null 值的选项。所需状态将作为选项使null 无效,这会将表单设置为无效,并将特定控件设置为无效。您可以以任何您想要的方式处理验证消息。

反应形式

在您的模板中

<form [formGroup]="form">
    <select [(ngModel)]="country" formControlName="country">
      <option [ngValue]="null">Choose a state</option>
      <option *ngFor="let option of items;"[ngValue]="option">{{option.name}}</option>
  </select>
</form>

在你的组件中

form = new FormGroup({
country: new FormControl(null, Validators.required)

使用模板驱动的表单

在您的模板中

<form #f="ngForm">
  <select name="countryTemplateForm" [ngModel]="countryTemplateForm" required>
    <option [ngValue]="null">Choose a country</option>
    <option *ngFor="let country of countries" [ngValue]="country">
      {{ country.name }}
    </option>
  </select>
</form>

在你的组件中

countryTemplateForm = null;
countries = [
  { name: 'USA'},
  { name: 'India' },
  { name: 'France' }
];

Have a look at this StackBlitz example!

【讨论】:

  • 我认为有一个误解,问题是“需要警报”表单提交,在你的小提琴中它不存在表单提交。 see
  • 我已经更新了 Stackblitz 以满足您的要求!
  • 使用响应式表单可以正常工作,但 Angular 会显示警告:“看起来您在与 formControlName 相同的表单字段上使用 ngModel。支持将 ngModel 输入属性和 ngModelChange 事件与响应式表单一起使用指令在 Angular v6 中已被弃用,并将在 Angular 的未来版本中删除。"
  • 更改为
  • 是的,在混合响应式表单和模板表单时,这是预期的。
【解决方案3】:

将选择状态值设置为空字符串&lt;option value=""&gt;Choose a state&lt;/option&gt;, 并在 ts 文件中将myDropDown 也声明为空字符串,即可解决问题。

 myDropDown = '';

 myDropDown= this.items[0].id;

html

 <form ngNativeValidate>
   <select [(ngModel)]="myDropDown"  (ngModelChange)="onChangeofOptions($event)" 
    required [ngModelOptions]="{standalone: true}">
     <option value="">Choose a state</option>
     <option *ngFor="let option of items;"[value]="option.id">{{option.name}}</option>
   </select>
   <input [hidden]="myDropDown !=='two'"type="text">
   <input type="submit" value="submit form">
  </form>

【讨论】:

  • &lt;option value=""&gt;Choose a state&lt;/option&gt; 不会选择选项默认选项,因为该角度需要设置&lt;option [value]="undefined"&gt;Choose a state&lt;/option&gt;
  • 如果要使用默认选项,请从列表中选择或在默认选项中明确设置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2018-03-25
  • 1970-01-01
  • 2018-01-07
  • 2016-06-13
  • 2011-03-21
相关资源
最近更新 更多