Angular:如何重置 matChipList 输入字段和 Google Recaptcha?

Posted

技术标签:

【中文标题】Angular:如何重置 matChipList 输入字段和 Google Recaptcha?【英文标题】:Angular: How to reset matChipList input field and Google Recaptcha? 【发布时间】:2020-10-28 14:36:14 【问题描述】:

我有一个表单中的输入字段,候选人必须输入他的技能。所以我做了一个芯片输入字段。问题是当我重置表格时,芯片中的值被清除但芯片视图仍然存在。我已经按照example 关注MatChips,但没有任何效果。以下是我的代码:

TS

@ViewChild('chipList') chipList: MatChipList;
@ViewChild('tags') tags: ElementRef;

profileForm = this.fb.group(tag: this.fb.array([]),
    Recaptcha: [false, Validators.requiredTrue]
);

add(event: MatChipInputEvent, form: FormGroup): void 
    const input = event.input;
    const value = event.value;
    // Add name
    if ((value || '').trim()) 
      const control = <FormArray>form.get('tag');
      control.push(this.initName(value.trim()));
    
    // Reset the input value
    if (input) 
      input.value = '';
    


remove(form, index) 
  form.get('tag').removeAt(index);


get Tags() 
  return this.profileForm.get('tag');


get ReCaptcha() 
    return this.profileForm.get('Recaptcha');


registerUser(formDirective: FormGroupDirective) 
  for(let i of this.Tags.value) 
    this.skills += i + ',';
  
  this.skills = this.skills.substring(0, this.skills.length-1);
  this.profileForm.patchValue(
    skills: this.skills,
    mobileNumber: this.MobileNumber.value.replace(/\-/gi, '')
  );
  if(this.ReCaptcha.value == true) 
    this.appService.userRegistration(this.profileForm.value).subscribe(response => 
      if(response.message != "Success.") 
        this.snackbarService.class = 'red-snackbar';
        return this.snackbarService.open('User Registration Unsuccessfull');
      
      this.router.navigate(['/login']);
      this.snackbarService.class = 'green-snackbar';
      this.snackbarService.open('User Registered Successfully');
    , error => 
      this.snackbarService.class = 'red-snackbar';
      this.snackbarService.open('Something went wrong');
    );
    formDirective.resetForm();
    this.profileForm.reset();
    this.tags.nativeElement.value = '';
  

HTML

<div class="row">
  <div class="col-md-12">
    <mat-form-field class="example-chip-list" appearance="outline" style="width: 100%;">
      <mat-label>Skills</mat-label>
      <mat-chip-list #chipList formArrayName="tag" matTooltip="Press Enter to seperate skills">
        <mat-chip *ngFor="let name of profileForm.get('tag')['controls']; let i=index;"
          [selectable]="selectable" [removable]="true" (removed)="remove(profileForm, i)">
          name.value
          <mat-icon matChipRemove *ngIf="true">cancel</mat-icon>
        </mat-chip>
        <input #tags [matChipInputFor]="chipList" [matChipInputSeparatorKeyCodes]="separatorKeysCodes"
          [matChipInputAddOnBlur]="addOnBlur" (matChipInputTokenEnd)="add($event, profileForm)">
      </mat-chip-list>
    </mat-form-field>
  </div>
</div>

<recaptcha formControlName="Recaptcha" (scriptError)="onScriptError()"></recaptcha>
<button type="submit" class="float-right" [disabled]="profileForm.invalid || !ReCaptcha"
  class="btnRegister btn">Register</button>

app.module

import  RecaptchaModule  from 'angular-google-recaptcha';

@NgModule(
    imports: [
    RecaptchaModule.forRoot(
      siteKey: 'SITE_KEY'
    )
]
)

这是我点击注册按钮后的当前场景:

【问题讨论】:

【参考方案1】:

改变这一行

this.tags.nativeElement.value = '';

this.tags.nativeElement.value = null;

【讨论】:

虽然整个代码可以用更简单的方式编写。如果仍然不能解决问题,请提供其余的相关代码。 如果相关代码的 stackblitz 可用则更好【参考方案2】:

当您将标签控件实现为表单数组时,可能会出现问题。它不存储控件数组,而是存储值数组。我制作了一个带有“清除表单”按钮的基本堆栈闪电战,希望能模拟您想要实现的目标。

你必须用一个空数组初始化标签formControl,并且在重置表单时,确保它也被设置为一个空数组。

https://stackblitz.com/edit/angular-tn3nai

【讨论】:

【参考方案3】:

您可以尝试分成两种不同的形式,一种用于您的数据,另一种用于重新验证。

通过这种方式,recaptcha 重置不会影响您的数据表单

【讨论】:

我不想在注册时出现这种情况,一切都会像新表格一样重置

以上是关于Angular:如何重置 matChipList 输入字段和 Google Recaptcha?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 重置自定义表单控件

如何在 ANGULAR 2 中提交表单时重置表单验证

如何在 Angular 2 中使用输入标签文件类型重置所选文件?

如何以编程方式重置或取消选中 Angular 中的单选按钮?

Laravel 5.1/AngularJS:在 Angular 视图中重置密码(如何验证 CSRF 令牌?)

了解 Nodejs 和 Angular 中的密码重置