Mud
Mud

Reputation: 29000

How to bind 'maxlength' attribute?

I can render the following Angular 2 component containing an <input> with a maxlength set:

@Component({
  selector: 'app',
  template: '<input maxlength="10">',
})
export class App {
}

This works fine. However, if I try to set the maxlength via a binding, like this:

@Component({
  selector: 'app',
  template: '<input [maxlength]="maxLength">',
})
export class App {
    maxLength = 10;
}

Or like this:

  template: '<input maxlength="{{maxLength}}">',

I get the following error:

"Template parse errors: Can't bind to 'maxlength' since it isn't a known property of 'input'."

Why? maxlength is a perfectly valid property of an <input> element.

Here's a live example (open console to see error).

Upvotes: 18

Views: 22970

Answers (3)

Hossein
Hossein

Reputation: 232

maxlenght must be camel Case syntax:

'<input [maxlength]="maxLength">' // wrong 

<input [maxLength]="maxLength">'  // correct

Upvotes: 0

Dushyant Singh
Dushyant Singh

Reputation: 1

we upload [attr.maxlength]="[field?.maxCharacters || '9999']"

Upvotes: 0

Madhu Ranjan
Madhu Ranjan

Reputation: 17934

excerpts from Angular documentation,

Attribute Binding

We become painfully aware of this fact when we try to write something like this:

<tr><td colspan="{{1 + 1}}">Three-Four</td></tr> We get this

error:

Template parse errors: Can't bind to 'colspan' since it
isn't a known native property 

As the message says, the element does not have a colspan property. It has the "colspan" attribute, but interpolation and property binding can set only properties, not attributes.

We need attribute bindings to create and bind to such attributes.

Attribute binding syntax resembles property binding. Instead of an element property between brackets, we start with the prefix attr, followed by a dot (.) and the name of the attribute. We then set the attribute value, using an expression that resolves to a string.

Here's a relevant Stack Overflow post about the difference between properties and attributes.

You may try below,

@Component({
  selector: 'app',
  template: '<input [attr.maxlength]="maxLength" >',
})
export class App {
    maxLength = '10';
}


@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

Here is the updated and it works Plunker!!

Upvotes: 54

Related Questions