离子 - 当标签 <form> 中有 *ngIf 时无法获取离子输入的值

Posted

技术标签:

【中文标题】离子 - 当标签 <form> 中有 *ngIf 时无法获取离子输入的值【英文标题】:Ionic - Can't get value of ion-input when there is *ngIf in tag <form> 【发布时间】:2018-10-25 10:36:20 【问题描述】:

我正在使用 Ionic 3 和 Angular 构建一个混合应用程序,但我被困在这个问题上:

我有一个表单,我只希望它根据控制器中的条件出现。

控制器:

export class ClassName implements OnInit
  private show: boolean = false;

  ngOnInit()
    if(someCondition)
      this.show = true;
    
  

查看:

<ion-content>
<button ion-button small block full color="danger" (click)="sum(discount.value)">Cancelar</button>

    <form *ngIf="show">  
      <ion-list>
        <ion-item>
            <ion-label  floating>Discount ($)</ion-label>
            <ion-input  #discount type="number"></ion-input>
          </ion-item>
      </ion-list>
    </form>

问题是,当变量 show 的值为 true(表单可见/显示)并且当我单击按钮时,什么也没有发生,也没有错误。但是当我从 tag 中删除 *ngIf="show" 时,点击按钮会正确调用该函数。

我不知道问题出在哪里,我不想仅仅使用 [hidden] 之类的东西来隐藏表单,如果条件为假,我不希望它被创建。

会不会是某种绑定问题?

我已经尝试将条件放在 ionViewWIllEnter() 中,但没有任何改变..

我需要帮助。

【问题讨论】:

【参考方案1】:

你有很多方法可以完成这项任务。

首先你必须知道,在 Angular 中你有两种类型的指令,结构化指令和非结构化指令。

结构指令是将从视图中删除或添加 html 块的指令,例如:*ngIf*ngFor*ngSwitch

另一种类型的指令就像在这种情况下ion-label 中的floating 指令一样,它会修改元素,但不会将其从模板中删除,可能会隐藏或使用 css 属性显示它。

也就是说,您可以使用NgModel 绑定折扣输入的值,当输入不再存在时,您仍然拥有该值。

组件

export class ClassName implements OnInit
  private show: boolean = false;
  public discount: number = 0;

  ngOnInit()
    if(someCondition)
      this.show = true;
    
  

查看

<button ion-button small block full color="danger" (click)="sum(discount)">Cancelar</button>

<form *ngIf="!show">  
   <ion-list>
      <ion-item>
         <ion-label  floating>Discount ($)</ion-label>
         <ion-input  type="number" [(ngModel)]="discount"></ion-input>
      </ion-item>
   </ion-list>
</form>

这样就可以了,记住如果你有一个[hidden] 指令,它的性能不如*ngIf,因为 Angular 仍然会检查隐藏的 html 块的状态和条件。

【讨论】:

【参考方案2】:

*ngIf 不只是显示或隐藏组件,它实际上是从模板中创建或删除组件的实例。

要显示或隐藏您的组件,您可以像这样使用hidden 属性:

<form [hidden]="!show">  
    <ion-list>
      <ion-item>
         <ion-label  floating>Discount ($)</ion-label>
         <ion-input  #discount type="number"></ion-input>
      </ion-item>
    </ion-list>
</form>

【讨论】:

以上是关于离子 - 当标签 <form> 中有 *ngIf 时无法获取离子输入的值的主要内容,如果未能解决你的问题,请参考以下文章

一个页面中有多个form要怎样处理

06-表单标签

如何动态更新离子中的meta标签?

与 <from:form> 标签一起使用时,Jquery 验证插件不显示消息?

离子3中意外的关闭标记离子列表

如何在离子 4 中的选择标签上插入图像?