为啥我不能阻止用户编辑 PrimeNG 表单字段值?

Posted

技术标签:

【中文标题】为啥我不能阻止用户编辑 PrimeNG 表单字段值?【英文标题】:Why I can't prevent that the user edit a PrimeNG form field value?为什么我不能阻止用户编辑 PrimeNG 表单字段值? 【发布时间】:2021-01-01 02:25:53 【问题描述】:

我正在使用 PrimeNG 处理一个 Angular 项目,我发现在尝试禁用将文本表单编辑到字段中时遇到以下困难。

基本上在我的组件的 html 代码中,我有这样的东西:

<input id="disabled-input"
       type="text"
       pInputText
       [disabled]="disabled"
       formControlName="UID" />

如您所见,它使用 formControlName 属性从 TypeScript 代码中定义的 FormGroup* 对象检索数据(它工作正常)。如您所见,我还设置了此项以避免编辑此字段值的可能性:

[disabled]="disabled"

然后在这个组件的 TypeScript 代码中声明了这个变量:

disabled = true;

所以我希望输入字段编辑被禁用,但事实并非如此,事实上我得到了这个:

奇怪的是,以这种方式在另一个组件中工作。唯一的区别是,在这个其他组件中,字段不绑定到表单,而是使用 [(ngModel)] 绑定字段值,以这种方式:

    <input id="disabled-input"
           type="text"
           pInputText
           [disabled]="disabled"
           [(ngModel)]="orderDetail.UID" />

在第二种情况下,它工作正常,用户无法编辑字段值。

为什么在第一种情况下我不能阻止用户编辑字段值?我可以获得这种行为吗?

【问题讨论】:

尝试在你的组件中设置禁用,而不是作为 html 属性,[disabled] 属性在反应形式中是不允许的(至少你会得到警告)。 this.myGroup.get('UID').disable(); 【参考方案1】:

第一种情况不起作用,因为它是模板驱动和响应式表单的混合。来自Angular docs:

模板驱动的表单依赖于模板中的指令来创建和 操作底层对象模型。它们对于添加 应用程序的简单表单,例如电子邮件列表注册表单。他们很容易 添加到应用程序中,但它们的扩展性不如反应形式。如果 你有非常基本的表单要求和可以管理的逻辑 仅在模板中,模板驱动的表单可能非常适合。

IMO 避免生产软件的模板形式。它们的可扩展性和可测试性不够。

对于响应式表单,需要禁用表单控件。

this.formGroup.get('UID').disable();

【讨论】:

【参考方案2】:

虽然它可能不是你正在寻找的东西,而不是

[禁用]="禁用"

我用过

readonly="只读"

实现这一目标。该字段未禁用但无法更改,这是我的目标。

      <input readonly="readonly" pInputText class="p-inputtext-sm" formControlName="featureName" />

【讨论】:

以上是关于为啥我不能阻止用户编辑 PrimeNG 表单字段值?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 CSS 设置无效 p-inputNumber PrimeNg 表单组件的红色边框?

如何从锚标记内提交我的 x 可编辑字段值以及我的表单/提交内容?

为啥 Chrome 不缓存我的动态表单字段?

角 PrimeNG。 PrimeFlex:输入字段的行为不符合预期

输入值始终为 0 并阻止表单验证

为啥我的 Ajax 发布请求在表单提交中被阻止?