全局关闭材料 matInput 的自动完成功能

Posted

技术标签:

【中文标题】全局关闭材料 matInput 的自动完成功能【英文标题】:Globally turn off autocomplete on material's matInput 【发布时间】:2019-12-12 08:29:01 【问题描述】:

有没有办法全局关闭材料的MatInput 字段的自动完成行为?我想摆脱这种到处重复的样板代码:

<input matInput formControlName="myCtrl" autocomplete="off" />

例如类似于在应用模块的提供程序数组中使用注入令牌全局定义表单字段的外观和标签选项:

// Default appearance of material form fields
 provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue:  appearance: 'fill'  ,
// Globally disable label of material form fields
 provide: MAT_LABEL_GLOBAL_OPTIONS, useValue:  float: 'never'  

我扫描了文档和源代码,但找不到任何东西。

【问题讨论】:

我不认为有这样的选择。有一个MAT_AUTOCOMPLETE_DEFAULT_OPTIONS 令牌,但没有禁用它的选项。您可以尝试使用全局脚本 这是我的担心。你有这样一个全球脚本黑客的来源吗? 我们可以在form标签上使用autocomplete="off",而不是将其添加到所有输入元素中吗? 【参考方案1】:

有点晚了,但也许会有帮助。

你可以添加这个简单的指令:

import  Directive, HostBinding, Attribute  from '@angular/core';

@Directive(
  selector: '[matInput]',
)
export class AutocompleteOffDirective 

  @HostBinding('attr.autocomplete') auto;
  constructor(@Attribute('autocomplete') autocomplete: string) 
    this.auto = autocomplete || 'off'
  


如果您选择覆盖自动完成属性,它将从元素中获取文本。

【讨论】:

记得将此指令添加到 app.module.ts 或其他一些模块以启用它【参考方案2】:

正如我在评论中所说,如果没有更好的解决方案,您可以添加一个全局脚本,将 autocomplete="off" 设置为您的所有 matInput 元素。

例如,您可以在 polyfills.ts 文件中添加这个 sn-p:

document.addEventListener('DOMContentLoaded', () => 

  Array.from(document.querySelectorAll('input[matInput]'))
    .forEach(element => 
      element.setAttribute('autocomplete', 'off');
    );

);

注意:考虑将箭头函数转换为普通函数以支持 IE11

【讨论】:

当 DOM 改变时监听器不会被触发。我尝试了MutationObserver,但它真的会扼杀任何性能,因为当我观察身体的变化时它几乎无休止地被解雇......所以,我认为这不值得麻烦。 @sl3dg3 你是对的,这不考虑*ngIf的东西

以上是关于全局关闭材料 matInput 的自动完成功能的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义指令使材料 <input matInput> 变为只读?

角2材料2中的预填充垫自动完成

带有对象代码和描述的角材料自动完成

React js材料ui自动完成芯片,里面有一个按钮

角材料自动完成不起作用,没有显示错误

重新定位材料自动完成弹出图标