【问题标题】:Angular2 select with ngValue nullAngular2 选择 ngValue null
【发布时间】:2016-08-15 09:08:48
【问题描述】:

这就是我想要做的:我想要一个选择列表绑定到具有 ngValue 的对象数组,但第一个选项需要是具有 null 值的“无”选项。

型号:

this.managers = [
  { id: null, name: "(None)" },
  { id: 1, name: "Jeffrey" },
  { id: 2, name: "Walter" },
  { id: 3, name: "Donnie" }
  ];

this.employee = {
  name: "Maude",
  managerId: null
};

查看:

<select [(ngModel)]="employee.managerId">
    <option *ngFor="#manager of managers" [ngValue]="manager.id">{{ manager.name }}</option>
  </select>

加载时,列表正确绑定到“无”元素。但是,如果您更改为不同的项目并返回,模型值现在会切换为字符串0: null。这很不方便;这意味着我必须在尝试将其保存到服务器之前拦截该值并将其手动更改为 null。

这是一个带有演示的 Plunker:http://plnkr.co/edit/BH96RWZmvbbO63ZAxgNX?p=preview

这在 Angular 1 中很容易通过额外的&lt;option value=""&gt;None&lt;/option&gt; 完成

这似乎是一种很常见的情况,但我一直找不到任何解决方案。我也尝试添加一个&lt;option [ngModel]="null"&gt;None&lt;/option&gt;,但它会产生相同的0: null 值。

有什么建议吗?

【问题讨论】:

  • 我猜你应该创建一个错误报告。

标签: angular


【解决方案1】:

我会将您重定向到 TabascoMustang 的 reddit 答案,我实施了他的解决方案并且工作出色:

TabascoMustang's reddit answer

这应该可以工作(为当前的 ng2 rc 更新):

<select [ngModel]="audit.managerId || ''" (ngModelChange)="audit.managerId = $event">
  <option value="">Please Select</option>
  <option *ngFor="let contact of audit.contacts">{{ contact.name }}
  </option>
</select>

【讨论】:

    【解决方案2】:

    目前有一个open issue in the github repository 用于此。

    作为一种解决方法,我发现添加 ngModelChange 是在视图中将值设置为 null 的最简单方法,而无需向组件添加任何内容。

    查看:

    <select [(ngModel)]="employee.managerId"
            (ngModelChange)="employee.managerId = $event ? $event : null">
        <option *ngFor="#manager of managers" [value]="manager.id">{{ manager.name }}</option>
    </select>
    

    请注意,ngValue 现在是 value

    【讨论】:

      【解决方案3】:

      将 [ngValue] 更改为 [value]

      【讨论】:

        【解决方案4】:

        对我来说,这确实看起来像一个错误,但如果您正在寻找快速解决方案,您可以简单地将 null 标识符转换为 string。它应该可以解决问题,但您应该采取一些额外的措施来使其发挥作用。

        参见示例Plnkr example

        或者,如果您打算按照您在 ng1 中提到的方式执行此操作, 你可以这样做:Plnkr example

        我知道这不是最佳解决方案,但希望在 NG 团队修复此错误之前对您有所帮助!

        【讨论】:

        • 我忘记了 ngModelChange,它至少可以帮助我解决问题。谢谢!
        • 我遇到了完全相同的问题,但如果使用类作为模型,您的解决方法将不起作用。你已经为你的属性指定了数据类型,并且编译器不允许你编译将 int 与字符串进行比较的代码。所以我最好希望他们能尽快解决这个问题。
        • 只是查看 Angular2 的更新日志,这在 2.2.1 中已修复
        • 顺便说一句,我在 Angular 2 中没有看到任何有关 ngValue 的文档。在 official guide 中,他们甚至使用常规的 value
        【解决方案5】:

        我创建了一个空白对象,而不是字符串“null”,以便稍后在我的 TypeScript 中进行比较。

        在组件中:

        blankObject = {
           toString() {
              return 'blank object';
           }
        };
        
        isBlank() {
            return this.filter.searchValue == null || this.filter.searchValue === this.blankObject;
        }
        

        在模板中:

        <select [(ngModel)]="filter.searchValue">
           <option [ngValue]="blankObject"></option>
           <option *ngFor="let item of filter.selectOptions" [ngValue]="item.value">
                        {{item.label}}
           </option>
        </select>`
        

        【讨论】:

        • 这太棒了。通过在 for 循环中使用 [ngValue] 还可以确保类型与来自 api 的类型相同,在本例中为数字类型,否则它将是默认字符串类型。
        猜你喜欢
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 2020-08-01
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        相关资源
        最近更新 更多