Got interpolation ({{}}) where expression was expected

AngularAngular2 TemplateAngular2 Forms

Angular Problem Overview


I have the following HTML but i get the the exception. How to fix it ?

> Parser Error: Got interpolation ({{}}) where expression was expected > at column 48 in > [!(editForm.controls.field_item_exportExpression_{{i}}?.dirty && > editForm.controls.field_item_exportExpression_{{i}}?.invalid)]

<div class="form-group">
  <label class="form-control-label" for="field_exportExpression">exportExpression</label>
  <input class="form-control" type="text" id="field_item_exportExpression_{{i}}" name="item_exportExpression_{{i}}" [(ngModel)]="datatype.items[i].exportExpression" required>
  <div [hidden]="!(editForm.controls.field_item_exportExpression_{{i}}?.dirty && editForm.controls.field_item_exportExpression_{{i}}?.invalid)">
   <small class="form-text text-danger" [hidden]="!editForm.controls.field_item_exportExpression_{{i}}?.errors?.required" dpTranslate="dataconfiguration.validation.required"> This field is
							required. </small>
 </div>
</div>

The following is not working. Saying unwanted token [ found.

[hidden]="!editForm.controls.['item_exportExpression_' + i]?.errors?.required 

The following is not complaining about [ but complaining Cannot read property '0' of undefined

 [hidden]="!editForm.controls.item_exportExpression_[ i]?.errors?.required 

Angular Solutions


Solution 1 - Angular

{{}} never goes together with [prop]="..." or (event)="..."

<small class="form-text text-danger" 
       [hidden]="!editForm.controls.['field_item_exportExpression_' + i]?.errors?.required" dpTranslate="dataconfiguration.validation.required"> This field is
                        required. 
</small>

Solution 2 - Angular

There are 4 types of bindings:

  • Property binding i.e. [] required to evaluate values
  • Model binding i.e. [()] required nothing special
  • Interpolation binding i.e. {{}} could be used with general attributes
  • Event binding i.e. () worked great with functions

To answer your question, something like this worked for us:

<input type="checkbox" [id]="['model-'+i]" [(ngModel)]="model" name="model-{{i}}" (change)="changeHandler($event)" />

Solution 3 - Angular

template

<div [hidden]="!checkIfInvalid(i, 'item_exportExpression_')">
    						<small class="form-text text-danger" [hidden]="isRequiredError(i, 'item_exportExpression_')" dpTranslate="dataconfiguration.validation.required"> This field is
    							required. </small>
    </div>

component

checkIfInvalid( index: number, field: string ): boolean {
        const control = this.getControl( index, field );
        if ( control && control.dirty && !control.valid ) {
            return true;
        }
        return false;
    }

    isRequiredError( index: number, field?: string ): boolean {
        const control = this.getControl( index, field );
        if ( control && control.getError( "required" ) ) {
            return true;
        }
        return false;
    }

Solution 4 - Angular

Use like this instead of interpolation

  <button class="btn btn-primary" title="Edit" (click)="showEditModal(record.id)"><i class="fa fa-edit"></i></button>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSaurabh KumarView Question on Stackoverflow
Solution 1 - AngularGünter ZöchbauerView Answer on Stackoverflow
Solution 2 - AngularxameeramirView Answer on Stackoverflow
Solution 3 - AngularSaurabh KumarView Answer on Stackoverflow
Solution 4 - AngularAbdus Salam AzadView Answer on Stackoverflow