我们希望有条件地以Angular 显示自动完成的表单,例如,当用户单击按钮时,表单将显示,该按钮将变为不可见(实际上,我们的设计当然更复杂).为此,最直观的做法似乎是有条件地渲染组件,例如使用@if:

@if(!showForm){
  <button (click)="showForm=true">show form</button>
} 

@if(showForm) {
  <form class="example-form">
    <mat-form-field class="example-full-width">
      <mat-label>Number</mat-label>
      <!-- #docregion input -->
      <input
        type="text"
        placeholder="Pick one"
        aria-label="Number"
        matInput
        [formControl]="myControl"
        [matAutocomplete]="auto"
      />
      <mat-autocomplete #auto="matAutocomplete">
        @for (option of options; track option) {
        <mat-option [value]="option">{{option}}</mat-option>
        }
      </mat-autocomplete>
    </mat-form-field>
  </

但这有一个小缺陷,即表单一呈现,MAT输入的标签就会上移到输入字段的顶部(类似于在空输入字段中输入内容时).对于其他组件,例如没有自动完成的输入,不会出现此问题.这是一张stackblitz link美元的支票.

经过多次调试,我们发现只需有条件地设置display=none,而不是用@if隐藏部分html,就可以防止出现这种情况.但我有兴趣知道为什么会这样?有没有比display=none更好的办法来避免这个问题?

任何帮助都非常感谢.

推荐答案

备选方案A

您可以使用属性hidden以与@if相同的方式显示/隐藏,并且您不会遇到这种行为!

@if(!showForm){
<button (click)="showForm=true">show form</button>
}
<form class="example-form" [hidden]="!showForm"> <!-- changed here -->
  <mat-form-field class="example-full-width">
    <mat-label>Number</mat-label>
    <!-- #docregion input -->
    <input
      type="text"
      placeholder="Pick one"
      aria-label="Number"
      matInput
      [formControl]="myControl"
      [matAutocomplete]="auto"
    />
    <mat-autocomplete #auto="matAutocomplete">
      @for (option of options; track option) {
      <mat-option [value]="option">{{option}}</mat-option>
      }
    </mat-autocomplete>
  </mat-form-field>
</form>

stackblitz


备选方案B

您可以使用属性floatLabel始终显示在顶部,而不是让它悬停!

@Input()FloatLabel:FloatLabelType

导出类型FloatLabelType=‘Always’|‘AUTO’; 标签是否应在用户键入时始终浮动.

@if(!showForm){
    <button (click)="showForm=true">show form</button>
} @if(showForm) {
<form class="example-form">
  <mat-form-field class="example-full-width" [floatLabel]="'always'">
    <mat-label>Number</mat-label>
    <!-- #docregion input -->
    <input
      type="text"
      placeholder="Pick one"
      aria-label="Number"
      matInput
      [formControl]="myControl"
      [matAutocomplete]="auto"
    />
    <mat-autocomplete #auto="matAutocomplete">
      @for (option of options; track option) {
      <mat-option [value]="option">{{option}}</mat-option>
      }
    </mat-autocomplete>
  </mat-form-field>
</form>
}

Typescript相关问答推荐

Typescript自定义键映射

为什么在将条件返回类型的字符串赋给数字时没有类型错误?

如何根据参数的值缩小函数内的签名范围?

在React中实现具有独立页面的嵌套路径的最佳实践是什么?

TypeScript Page Routing在单击时不呈现子页面(React Router v6)

为什么TypeScript失go 了类型推断,默认为any?''

扩展函数签名中的参数类型,而不使用泛型

使用泛型keyof索引类型以在if-condition内类型推断

是否有一个版本的联合类型递归地使属性只出现在一个可选选项中?

如何将泛型对象作为返回类型添加到类型脚本中

为什么有条件渲染会导致material 自动完成中出现奇怪的动画?

对未到达受保护路由的路由环境做出react

在列表的指令中使用intersectionObservable隐藏按钮

为什么我的导航在使用Typescript的React Native中不起作用?

Typescript,如何在通过属性存在过滤后重新分配类型?

使用来自API调用的JSON数据的Angular

如何知道使用TypeScript时是否在临时工作流内运行

Typescript:是否将联合类型传递给重载函数?

const nav: typechecking = useNavigation() 和 const nav = useNavigation() 之间有什么区别?

使用react+ts通过props传递数据