angular - 带有比较功能的Angular 6 mat-select问题
问题描述
在我的 Angular 6 项目中,我有一个mat-select,我必须使用该compareWith
功能,因为我正在选择对象。
但是目前,如果我没有选择任何东西,似乎选择了第一个选项,我没有在该字段中手动设置任何值,我看到比较函数正在比较第一个选项......我没有想要这种行为。null
正确的表单在该字段中仍然具有值。
这是预期的行为还是我遗漏了什么?
PS 我不能null
在我的选项中添加一个选项。
html
<mat-form-field>
<mat-select (selectionChange)="fareExceptionHandler(); setFareExceptionCode($event)" formControlName="fareException" [compareWith]="displayFn"
placeholder="{{'ticket.new.labels.fareexception' | translate }}" name="fare">
<mat-option *ngFor="let fare of fareExceptionsList" [value]="fare">
{{ fare.name }} </mat-option>
</mat-select>
</mat-form-field>
比较功能
displayFn(model: any) {
if ((model !== undefined) && (model !== null)) {
return model.name;
}
}
***********************************************编辑** *****************************************
这是一个类似的例子 https://stackblitz.com/edit/angular-rykism?file=app%2Fselect-overview-example.ts
解决方案
你的compareWith
功能是错误的。您像使用自动完成displayWith
功能一样使用它,但它不是那样工作的。它接受两个参数并返回一个boolean
值。它的主要目的是从外部应用的值中找到匹配的选项,这在初始化时会自动发生,如果您使用表单控件,则表单控件的值用于初始化选择值。
当参数对象相等时,默认实现返回 true。您的实现返回name
作为选项项目的第一个参数对象的 。这是真的,因此您的函数最终会在初始化时匹配列表中的第一个选项。第二个参数是undefined
初始化时传入的“set”值(除非您的表单控件有值)。
所以你的函数本质上是说它undefined
与第一个选项匹配,所以列表在启动时选择第一个选项。您可能根本不需要使用compareWith
,所以只需摆脱它。
推荐阅读
- python - 是否可以在 numpy 数组中删除特定列?
- python - 为变量赋值的 Pythonic 方式 if 语句不引发异常
- azure-devops - 如何使用 Yarn 注册表作为 Azure DevOps 工件上游源?
- python - 在 Python + Selenium 中从类中的第二个 div 打印文本
- javascript - 帖子正文中缺少必需的参数 To
- regex - 正则表达式字母数字,但当它得到一个数字时,那么只有数字
- python - 如何通过numpy在每一行中加载不同数量的字符串元素
- c - scanf存储值太长,它读取的第二个值存储两次
- flutter - 缺少静态目标的未实现处理,Flutter
- javascript - React.js 你如何连接来自状态的动态文本