简体   繁体   English

错误RangeError:超出最大调用堆栈大小(Angular 6)

[英]ERROR RangeError: Maximum call stack size exceeded (Angular 6)

I am trying to use nested reactive forms in angular and gave validations on each field. 我试图在角度中使用嵌套的反应形式,并在每个字段上给出验证。 I am checking the fields after I submit the form. 我在提交表格后正在检查字段。 If there are any errors the form shows them and keeps listening for changes. 如果有任何错误,表单会显示它们并继续监听更改。 Now, the nested form login is throwing "Maximum stack call exceeded error". 现在,嵌套表单登录正在抛出“最大堆栈调用超出错误”。 I understood that's because browser kept calling login() getter defined in TS file. 我明白这是因为浏览器一直在调用TS文件中定义的login()getter。 Can anyone tell me how to fix this? 谁能告诉我如何解决这个问题?

Error in console:
ERROR RangeError: Maximum call stack size exceeded
    at VendorSignupComponent.get [as login] (vendor-signup.component.ts:53)
    at VendorSignupComponent.get [as login] (vendor-signup.component.ts:54)
    at VendorSignupComponent.get [as login] (vendor-signup.component.ts:54)
    at VendorSignupComponent.get [as login] (vendor-signup.component.ts:54)
    at VendorSignupComponent.get [as login] (vendor-signup.component.ts:54)
    at VendorSignupComponent.get [as login] (vendor-signup.component.ts:54)
    at VendorSignupComponent.get [as login] (vendor-signup.component.ts:54)

component.html: component.html:

<div class="container">
  <form [formGroup]="vendorSignupForm" (ngSubmit)="onSubmit()">

    <div class="form-group">
      <div class="row">
        <div class="col-sm-6 col-md-4">
          <label for="name">Restaurant Name</label>
          <input type="text" formControlName="name" class="form-control" pattern="[a-zA-z\\s]+" [ngClass]="{'is-invalid': submitted && f.name.errors}" />
          <div *ngIf="submitted && f.name.errors" class="invalid-feedback">
            <div *ngIf="f.name.errors.required">Name is required</div>
            <div *ngIf="f.name.errors.pattern">Not a valid name!</div>
          </div>
        </div>
      </div>
    </div>

    <div class="form-group">
      <div class="row">
        <div class="col-sm-6 col-md-4">
          <label for="emailId">Email</label>
          <input type="email" formControlName="emailId" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.emailId.errors }" />
          <div *ngIf="submitted && f.emailId.errors" class="invalid-feedback">
            <div *ngIf="f.emailId.errors.required">Email is required</div>
            <div *ngIf="f.emailId.errors.email">Not a valid email!</div>
          </div>
        </div>
      </div>
    </div>

    <div formGroupName="login">
      <div class="form-group">
        <div class="row">
          <div class="col-sm-6 col-md-4">
            <label for="password">Password</label>
            <input type="password" formControlName="password" class="form-control" [ngClass]="{ 'is-invalid': submitted && login.password.errors }" />
            <div *ngIf="submitted && login.password.errors" class="invalid-feedback">
              <div *ngIf="login.password.errors.required">Password is required</div>
              <div *ngIf="login.password.errors.minlength">Password must be at least 8 characters</div>
              <div *ngIf="login.password.errors.maxlength">Password cannot be more than 15 characters</div>
            </div>
          </div>
        </div>
      </div>
      ...
    </div>

component.ts: component.ts:

export class VendorSignupComponent implements OnInit {

  submitted = false;
  vendorSignupForm: FormGroup;

  constructor(
    private formBuilder: FormBuilder,
    private router: Router
  ) {}

  ngOnInit() {
    this.vendorSignupForm = this.formBuilder.group({
      name: ['', Validators.required],
      emailId: ['', [Validators.required, Validators.email]],
      openingTime: ['', Validators.required],
      closingTime: ['', Validators.required],
      minDeliveryTime: ['', Validators.required],
      minOrder: ['', Validators.required],
      mainCuisineType: ['', Validators.required],
      imageUrl: ['', Validators.required],
      numOfTables: ['', Validators.required],
      category: ['', Validators.required],
      vendorRegistrationId: ['', Validators.required],
      vendorAddress: this.formBuilder.group({
        street: ['', Validators.required],
        city: ['', Validators.required],
        pincode: ['', [Validators.required, Validators.minLength(6), Validators.maxLength(6)]],
        state: ['', Validators.required],
        phoneNumber: ['', [Validators.required, Validators.maxLength(10), Validators.minLength(10)]],
        landlineNumber: [''],
      }),
      login: this.formBuilder.group({
        password: ['', [Validators.required, Validators.minLength(8), Validators.maxLength(15)]],
        role: ['vendor']
      })
    });
  }

  get f() {
    return this.vendorSignupForm.controls;
  }

  get login() {
    return this.login.controls;
  }

  get vendorAddress() {
    return this.vendorAddress.controls;
  }

  onSubmit() {
    this.submitted = true;
    console.log(this.vendorSignupForm.value);

    if (this.vendorSignupForm.invalid) {
      return;
    }
  }
}

The line this.login.controls inside getter of login again tries to invoke the same getter because you try to access this.login which leads to recursion. login getter中的this.login.controls行再次尝试调用相同的getter因为你试图访问this.login导致递归。 And also this.login.controls wont give you the controls directly. 而且this.login.controls也不会直接给你控件。 You have to fetch it through vendorSignupForm as shown below. 您必须通过vendorSignupForm获取它,如下所示。

Consider refactoring your login getter as follows. 考虑重构您的login getter,如下所示。

get login() {
    let login = this.vendorSignupForm.get('login') as FormGroup;
    return login.controls;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 错误范围错误:超出最大调用堆栈大小 [Angular] - ERROR RangeError: Maximum call stack size exceeded [Angular] angular 5递归模板错误RangeError:超出最大调用堆栈大小 - angular 5 recursive template ERROR RangeError: Maximum call stack size exceeded in Angular 7 错误 RangeError:超出最大调用堆栈大小 - Angular 7 error RangeError: Maximum call stack size exceeded 角度2:未捕获(承诺):RangeError:超出最大调用堆栈大小RangeError:超出最大调用堆栈大小 - Angular 2 :Uncaught (in promise): RangeError: Maximum call stack size exceeded RangeError: Maximum call stack size exceeded RangeError:调用堆栈的最大大小超出了Angular 5 Router - RangeError: Maximum call stack size exceeded Angular 5 Router RangeError:超出最大调用堆栈大小(在angular2中) - RangeError: Maximum call stack size exceeded in angular2 Angular HttpInterceptor RangeError:超出最大调用堆栈大小 - Angular HttpInterceptor RangeError: Maximum call stack size exceeded Angular 2 Lazy Loading:RangeError:超出最大调用堆栈大小 - Angular 2 Lazy Loading : RangeError: Maximum call stack size exceeded RangeError:超出最大调用堆栈大小延迟路由 Angular 2 - RangeError: Maximum call stack size exceeded Lazy routing Angular 2 错误 RangeError:Object.getApps 超出了最大调用堆栈大小 - ERROR RangeError: Maximum call stack size exceeded at Object.getApps
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM