将“ngModelOptions”从自定义组件传递到包含的本机元素

2024-01-30

我有一个名为的自定义组件(Angular 6)ppo-currency-field使用以下模板:

<span class="display" tabindex="-1">{{formattedValue()}}</span>
<input #input class="input" type="number" [name]="name" 
    [tabindex]="tabindex" [readonly]="!!readonly || readonly===''" 
    [disabled]="!!disabled || disabled===''" [ngModel]="value" 
    (ngModelChange)="writeValue($event)" [ngModelOptions]="ngModelOptions">

我的组件代码包含以下行:

@Input() ngModelOptions: Object;

我正在使用我的组件:

<ppo-currency-field [ngModel]="data.planningHours.rate"
  (ngModelChange)="data.planningHours.rate = $event; recalc();"
  [ngModelOptions]="{ updateOn: 'blur' }" 
  [disabled]="!data.containsPlanning ? '' : null"></ppo-currency-field>

正如你所看到的,我正在尝试“穿过”ngModelOptions从我的自定义组件到input元素。但这不起作用,因为更新选项没有设置为“模糊”;事实上,似乎根本不再发生任何更新。

但是,当我设置该选项时input元素directly,效果很好。

为什么我的传递不起作用,我该如何正确实施它?

编辑:只有当我尝试使用时才会出现问题ngModelOptions作为属性名称。如果我将其更改为例如options, 有用。我想这没问题,但我试图让我的组件表现得尽可能像本机输入字段。直觉上我不应该尝试重用 Angular 指令,但在这种情况下ControlValueAccessor接口应该提供一个钩子来捕获这些选项,就像它所做的那样ngModel/ngModelChange.


The ngModelOptions自定义组件级别的属性适用于 ControlValueAccessor,而无需将内部输入元素绑定到自定义@Input() ngModelOptions属性,如您所见这次堆栈闪电战 https://stackblitz.com/edit/angular-s9y69o.

为了ngModel自定义组件的正确更新:

  1. 内部输入元素应在更改时更新(默认选项),以确保 ControlValueAccessor 也可以在更改时更新。

  2. For the {updateOn: 'blur'}工作的选择,onTouched当输入元素失去焦点时,应调用 ControlValueAccessor 的事件回调:

<input ... 
  [ngModel]="value" 
  (ngModelChange)="writeValue($event)" 
  (blur)="onTouchedCallback()" />

where onTouchedCallback在自定义组件中设置:

registerOnTouched(fn: any): void {
  this.onTouchedCallback = fn;
}

需要调用的说明onTouched回调在评论中给出kara https://github.com/kara in 问题20384 https://github.com/angular/angular/issues/20384在 Github 上:

The {updateOn: 'blur'}顶层的功能取决于 控制其下面的值访问器实现registerOnTouched适当地。看起来您的自定义组件保存了回调,但是 从来没有真正调用过它。由于它没有被调用,所以该值不会 正确更新。我建议添加一个(blur)="onTouchedCallback()"到您的 ControlValueAccessor ,它应该可以工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将“ngModelOptions”从自定义组件传递到包含的本机元素 的相关文章

随机推荐

  • docker-compose 的端口号未更改

    我已经在 docker compose 中指定了端口映射 但它仍然无法正常工作 我仍然必须使用公开中未指定的端口来访问站点 下面是我的docker compose yml version 2 networks default externa
  • 试图理解 boost::beast multibuffer

    Beast websocket 示例将数据存储在多缓冲区中 该实现使用一系列一个或多个字符数组 大小不同 额外的字符数组对象被附加到 适应字符大小变化的顺序 顺序 当我查看界面时 我并不完全清楚它是如何工作的 如果我阅读描述 它可以被视为缓
  • 在 IOS7 中检测启用蓝牙的 iPhone 设备

    我在我的应用程序中使用核心蓝牙框架 我知道如何扫描外围设备并从中获取值 例如心率监视器 但我想要的是检索支持 BLE 4 0 和蓝牙功能的周围 iPhone 设备列表 我参考了下面的链接 使用 IOBluetooth 框架 http www
  • 将“is null”转换为 linq to sql 语句

    我在将以下 sql 复制为 LINQ 语句时遇到问题 select TableA from TableA left outer join TableAinTableB on TableA Id TableAId where TableBId
  • 使用 Azure AD 和 WebAPI 进行服务到服务身份验证

    我创建了一个 NET core Web 应用程序 它使用 Azure AD 作为身份 这一切都按预期正常工作 并且我使用 Authorize 装饰的任何内容都受到保护 我现在想要确保我的一个 API 控制器能够从外部服务访问 我遵循了本教程
  • 从外设更改 CBAdvertisementDataManufacturerDataKey

    有什么办法可以修改吗CBAdvertisementDataManufacturerDataKey from CBPeripheralManager 我明白我可以获得CBAdvertisementDataManufacturerDataKey
  • 在调试器中更改 Python 代码

    有没有允许在调试时更改Python代码的调试器 换句话说 发生运行时异常 调试器停止 我以任何我喜欢的方式更改代码 并告诉程序继续 我知道这种方法存在的问题 例如 如果我动态重新定义函数 对函数的引用仍然会指向旧定义 等等 我对此表示同意
  • 使用 FFaker::Internet.user_name 时指定最小长度

    我有一个规范一直失败 因为 FFaker Internet user name 生成的单词少于 5 个字符 如何在此 stmt 中指定最小长度 username FFaker Internet user name String ljust
  • 邮箱/垃圾箱验证[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要为注
  • UWP DatePicker 月份的自定义字符串

    我正在为非英语用户做UWP应用程序 我需要使用 DatePicker 但我不喜欢月份名称用英文书写 我也不想用数字值显示月份 如何设置自己的字符串列表以将其显示在月份选择器上 据我所知 DatePicker不提供月份自定义字符串的机制 如果
  • QRect 的 qHash 函数

    计算的最佳方法是什么qHash的值QRect 我需要使用QRect 有可能QRectF 作为关键QCache 现在我正在使用这样的东西 inline uint qHash const QRect r return qHash QByteAr
  • $(document).ready(initialize) 和 $(document).on('ready',initialize) 有什么区别?

    有什么区别 document ready initialize and document on ready initialize 对我来说 它们似乎以同样的方式工作 document on ready initialize 如果执行文件时
  • 在jsp中使用另存为对话框下载文件...如何提示用户保存,查看取消对话框而不是直接打开图像

    我有一个jsp 其中我提供了一个用于下载任何文档的链接 每当用户单击链接时 都会直接打开文档 我想显示一个对话框 通常出现在许多网站上 它会要求用户保存 取消和查看文档 有人可以帮我吗 我在我的控制器类中使用以下代码 InputStream
  • 访问主程序子目录中的文件

    包含我的主要可执行文件的文件夹非常混乱 其中包含输入 输出和源文件 我想将其中一些文件移动到可执行文件的不同目录中 但仍然能够访问它们 例如 如果我可以制作一个目录 那就太好了 main outfile 它保存了我的程序的所有输出文件 在
  • OpenSSL ASN.1 编程教程

    我正在寻找有关使用 OpenSSL 库进行 ASN 1 DER 编码的任何 C C 教程 示例代码或文档 好吧 正如您在 openssl 网站上看到的那样 没有 ASN 1 函数的官方文档 但你总是可以下载 openssl 源 http o
  • Docker 不会在目录中搜索文件

    我创建了一个 docker 文件 FROM node 13 6 0 alpine3 10 WORKDIR src RUN apk add no cache bash COPY package json COPY package lock j
  • Marklogic Eclipse 设置

    我一直在尝试使用 marklogic 设置 eclipse 以将其用作我的 xquery 编辑器 我按照 Marklogic 关注此链接 http developer marklogic com learn xqdt setup http
  • Google Drive API Java 权限 500 内部错误

    我有下一个共享 Google Drive 文件的方法 public static boolean shareFile HttpServletRequest httpReq String fileId String user String r
  • setMultiChoiceItems 和 setMessage 在 AlertDialog 中不“工作”

    我很困惑为什么我的对话框无法正常工作 AlertDialog dialog final AlertDialog Builder builder new AlertDialog Builder this final CharSequence
  • 将“ngModelOptions”从自定义组件传递到包含的本机元素

    我有一个名为的自定义组件 Angular 6 ppo currency field使用以下模板 span class display formattedValue span