【问题标题】:How to select default drop-down option based on falsy value in Angular?如何根据Angular中的虚假值选择默认下拉选项?
【发布时间】:2018-06-04 17:50:43
【问题描述】:

在以下模板中,当基础model.militaryStatus 属性为null 时,“选择军事状态”选项将成为选定选项。

<select [(ngModel)]="model.militaryStatus">
  <option [ngValue]="null">Select Military Status</option>
  <option *ngFor="let status of militaryStatuses" [value]="status.id">{{ status.description }}</option>
</select>

问题在于,为了选择“选择军事状态”选项,ngModel-bound 字段需要准确null——不是undefined,不是空白字符串,但 null。如果它们不完全相等,你会得到这样的东西,没有选择的选项:

当底层组件属性具有 any 虚假值时,有没有办法显示给定的 option?这样,无论 API 返回 0undefinednull 还是空白字符串(所有常见用例取决于场景),都将显示默认选项,而不会破坏用户体验的空白 drop-下来了吗?

编辑:Here's a stackblitz sandbox showing an example of this issue

【问题讨论】:

    标签: angular angular2-template


    【解决方案1】:

    您可以将第一个选项调整为model.militaryStatus 的当前值:

    • 如果model.militaryStatus为假,则第一个选项的值为model.militaryStatus
    • 如果model.militaryStatus为真,则第一个选项的值为null
    <select [(ngModel)]="model.militaryStatus">
      <option [ngValue]="!model.militaryStatus ? model.militaryStatus : null">Select Military Status</option>
      <option *ngFor="let status of militaryStatuses" [value]="status.id">{{ status.description }}</option>
    </select>
    

    请参阅this stackblitz 以获取演示。

    【讨论】:

      【解决方案2】:

      对于模板驱动的表单,我这样做并获得了默认选择。

      在ts中分配model.militaryStatus=null

      Example

      【讨论】:

      • 虽然这确实有效,但我试图避免必须这样做来“规范化”可能返回空白字符串而不是 null 的 API 响应。必须使用 if (!!model.militaryStatus) { model.militaryStatus = null; } 之类的东西手动将 falsy 值转换为 nulls 感觉好像没有必要。理想情况下,API 响应应该在适当的时候统一返回 nulls,但修改 API 并不总是一种选择。
      • @JacobStamm 您会从 API 获取默认值还是将这个值存储在客户端?
      • 在我的情况下,来自 API,但数据的来源应该无关紧要
      • @JacobStamm 如果默认值将与其他选项值在同一数据中,我们将确定,默认值将是第一个。我们可以使用响应式表单,并通过 FormGroup 以编程方式设置默认值
      猜你喜欢
      • 2019-05-16
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 2021-01-13
      相关资源
      最近更新 更多