louisdeck
louisdeck

Reputation: 197

Angular 2 Form Validation Error "Unhandled Promise rejection: Cannot assign to a reference or variable!"

App.component.html

<div class="container">
  <h2>Form Validation</h2>
  <form>
<div class="form-group">
  <label for="prettyName">Name</label>
  <input type="text" class="form-control" id="prettyName" required minlength="4" maxlength="20" [(ngModel)]="prettyName" name="prettyName" #name="ngModel">
  <div *ngIf="name.errors && (name.dirty || name.touched)" class="alert alert-danger">
    <div [hidden]="!name.errors.required">
      Name is required
    </div>
    <div [hidden]="!name.errors.minlength">
      Name must be at least 4 characters long
    </div>
    <div [hidden]="!name.errors.maxlength">
      Name cannot be more than 20 characters long
    </div>
  </div>
</div>
    <button type="submit" class="btn btn-default">Submit</button>
  </form>
</div>
// ... (Same things for username, email and password)

App.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
 prettyName: string;
  username: string;
  email: string;
  password: string;
}

I have followed the official documentation about form validation: https://angular.io/docs/ts/latest/cookbook/form-validation.html#!#template1

Does anyone know where this error is coming from please?

Cheers

Upvotes: 15

Views: 6230

Answers (6)

Vincent Verrier
Vincent Verrier

Reputation: 241

For me it was the use of the template var declaration pattern with *ngIf

<div *ngIf="10; let numVar">{{numVar}}</div>

It seems to be forbidden in production mode

Upvotes: 0

Julien
Julien

Reputation: 2756

I had that error with a [(ngModel)] inside a *ngFor :

<div *ngFor="let condition of rule.conditions; let i = index" class="condition">    
        <condition [(condition)]="condition" ...

I had to do this :

<div *ngFor="let condition of rule.conditions; let i = index" class="condition">    
        <condition [(condition)]="rule.conditions[i]" ...

Upvotes: 4

Alberto Chiesa
Alberto Chiesa

Reputation: 7350

This error can popup with different causes. The one I found involves the use of ngFor. In particular, when binding ngModel to the iteration variable:

<div *ngFor="let item of items">
  <input [(ngModel)]="item" />
</div>

This kind of pattern will trigger the same cryptic error.

Upvotes: 2

Code Spy
Code Spy

Reputation: 9954

Using Angular 6 Forms

encountered this error "ERROR Error: Uncaught (in promise): Error: Cannot assign to a reference or variable!"

To resolve this issue I changed this HTML

<input type="text" class="form-control" name="username" [(ngModel)]="username" placeholder="Username" required #username="ngModel"/>
<div [hidden]="username.valid || username.pristine" class="alert alert-danger">
  Name is required
</div>

To this

<input type="text" class="form-control" name="username" [(ngModel)]="username" placeholder="Username" required #usernameMsg="ngModel"/>
<div [hidden]="usernameMsg.valid || usernameMsg.pristine" class="alert alert-danger">
  Name is required
</div>

reference name and model name were same

Upvotes: 1

Felix Runye
Felix Runye

Reputation: 2521

This error occurs when you try to define a template reference variable with the same name of an existing variable, like for example in this case:

    @Component({
    selector: 'example',
    template: `
       <label for="name">Name</label>
       <input type="text" [(ngModel)]="name" #name="ngModel" >
       `
    })
   export class AppComponent {
     name:string;

 }

As you can see, there’s the template reference variable #name on the input and there’s also a variable called name on my class, this will cause the following error when you try to run the application:

   zone.js:355 Unhandled Promise rejection: Cannot assign to a 
   reference or variable! ; Zone: <root> ; Task: Promise.then ; Value: 
   Error: Cannot assign to a reference or variable!(…) Error: Cannot 
   assign to a reference or variable!

the solution is to change the name of one of your variables.

Upvotes: 5

Poul Kruijt
Poul Kruijt

Reputation: 71891

You should either change your component variable, or your template #name variable. They are colliding:

export class AppComponent {
  prettyname: string; // here
  username: string;
  email: string;
  password: string;
}

Also change your String to string

<form>
  <div class="form-group">
    <label for="prettyName">Name</label>
    <input type="text" class="form-control" id="prettyName" required minlength="4" maxlength="20" [(ngModel)]="prettyName" name="prettyName" #name="ngModel">
    <div *ngIf="name.errors && (name.dirty || name.touched)" class="alert alert-danger">
      <div [hidden]="!name.errors.required">
        Name is required
      </div>
      <div [hidden]="!name.errors.minlength">
        Name must be at least 4 characters long
      </div>
      <div [hidden]="!name.errors.maxlength">
        Name cannot be more than 20 characters long
      </div>
    </div>
  </div>
<button type="submit" class="btn btn-default">Submit</button>

Upvotes: 20

Related Questions