Javascript/Angular2 如何根据表单字段值切换按钮

Posted

技术标签:

【中文标题】Javascript/Angular2 如何根据表单字段值切换按钮【英文标题】:Javascript/Angular2 How can I toggle button based on the form field values 【发布时间】:2017-08-26 11:54:42 【问题描述】:

我有一个包含必填字段的表单 - 1.名字 2.姓氏 3.电话 4. 状态 5. 城市 6. 出生日期 我有一个按钮,该按钮应根据表单输入切换为完成/未完成。仅当所有字段都具有正确的值时,该按钮才应切换为“完成”。如果我再次删除任何值,则该按钮应切换为未完成。

在我的 ts 文件中-

formCompleteOrIncomplete(person,index) 
   if (person.dateOfBirth !== "" && person.phone!== "" &&
      (person.firstName !== undefined || person.firstName !== "") && (person.lastName !== undefined || person.lastName !== "") && (person.state !== undefined || person.state !== "") && (person.city !== undefined || person.city !== "" ))       
      person.status = true;

    
    else 
      person.status = false;      
    
 

在我的 html 文件中-

<div class="tag">
   <div class="success" *ngIf="person.status">Complete</div>
   <div class="failed" *ngIf="!person.status">Incomplete</div>
</div>

表单域-

   <md-input required [(ngModel)]="person.firstName" (ngModelChange) = "formCompleteOrIncomplete(person, index)" aria-placeholder="First Name" placeholder="First Name" name="firstName" #firstName="ngModel"></md-input>

在页面加载时,按钮显示“不完整”,因为没有输入任何字段值,当我输入所有字段时,按钮被切换为“完成”,但是当我再次尝试清空任何字段时,它确实不会再次切换到“不完整”。

另外,当我不包括对“未定义”的检查而只包括“”检查时,在页面加载时按钮显示“完成”。不知道为什么会发生这种情况。

谁能告诉我哪里出错了?

【问题讨论】:

你可以设置一个布尔值来检查它formControl是否有效如果它有效你将按钮值更改为完成或真或不完整或假 【参考方案1】:

您不需要formCompleteorIncomplete 函数或ngModel, ngModelChange etc...

你应该使用 angular2 的ReactiveForms。 ReactiveForms 是处理表单的首选方法。

像这样:

ngOnInit() 
    this.form= this.formBuilder.group(
      firstName: ['', Validators.required ],// <--- set any validators here
      lastName: ['', Validators.required ],
      ...//and so on...
      )
    );

接下来,添加一个formControlName:

<md-input required formControlName="firstName" aria-placeholder="First Name" placeholder="First Name" name="firstName"></md-input>

最后,您可以使用form.valid 切换按钮,如下所示: (form.valid 的变化取决于表单是否有效(基于您在上面设置的验证器)。

<div class="tag">
   <div class="success" *ngIf="form.valid">Complete</div>
   <div class="failed" *ngIf="!form.valid">Incomplete</div>
</div>

Check this site out for an example.

【讨论】:

【参考方案2】:

我相信您的问题出在您的 if 语句中使用 || (或)运算符的部分。他们应该使用 &amp;&amp; (and) 运算符,因为您不希望它们成为要填写的任何一个值。当您在填写其余字段后将名字字段更改为空时,检查的第一部分将通过,因为空字符串不是undefined

您应该能够稍微清理一下,因为您正在检查表单字段的两个部分中的错误值。空字符串 undefinednull 都将转换为 false 布尔值(您可以在控制台中通过将 !(非)运算符放在值之前来查看它,并在转换为布尔值,每个都是false - 即!'' 会将空字符串转换为布尔值,然后执行非操作,因此您将在控制台中看到true

formCompleteOrIncomplete(person,index) 
    // Inverted the order of your true/false portions to match if statement
    if (!person.dateOfBirth || !person.phone || !person.firstName ||
        !person.lastName || !person.state || !person.city) 
        person.status = false;
    
    else 
        person.status = true;
    
    
    // Or you could do this to keep the same structure of your if statement
    if (!!person.dateOfBirth && !!person.phone && !!person.firstName &&
        !!person.lastName && !!person.state && !!person.city) 
        person.status = true;
    
    else 
        person.status = false;
    
    
    // You could even set the status using your check if you feel comfortable doing that
    person.status =
        !!person.dateOfBirth && !!person.phone && !!person.firstName &&
        !!person.lastName && !!person.state && !!person.city;

【讨论】:

解释得很好!将 OR 运算符更改为 AND 有效。我还必须同时检查未定义和空检查。

以上是关于Javascript/Angular2 如何根据表单字段值切换按钮的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript/Angular2 LocalStorage 可以得到任何东西

javascript Angular2 + jquery数据表(原始)

javascript angular2-knob.umd.js

Javascript angular2gridster 让它工作

打字稿 | JavaScript | Angular 2:动态设置@HostListener 参数

如何根据表日期导出 MySQL 表?