12

How to get number in [(ngModel)] in Angular 2?

<select [(ngModel)]="levelNum">
    <option *ngFor="#level of levels" [value]="level.num">{{level.name}}</option>
</select>

levelNum:number;
levels:Array<Object> = [
    {num: 0, name: "AA"},
    {num: 1, name: "BB"}
];

I tried to add type="number" in different places.

 <select type="number" [(ngModel)]="levelNum">
    <option *ngFor="#level of levels" [value]="level.num">{{level.name}}</option>
</select>

and

 <select [(ngModel)]="levelNum">
    <option type="number" *ngFor="#level of levels" [value]="level.num">{{level.name}}</option>
</select>

But when I select a new item, levelNum still becomes a string.

Hongbo Miao
  • 45,290
  • 60
  • 174
  • 267

2 Answers2

9

The Select with *ngFor in Angular2 seems to not work properly when using objects. They have opened the issue in github but it still hasn't been resolved.

Until this is fixed I would do something like changing the string value to a number whenever the select value is changed.

@Component({
  selector: 'my-app',
  template:`
    <h1>Selecting Number</h1>
    <select type="number" [(ngModel)]="levelNum" (ngModelChange)="toNumber()">
      <option *ngFor="#level of levels" [value]="level.num">{{level.name}}</option>
    </select>
    {{levelNum}}
  `,
})
export class AppComponent {
  levelNum:number;
  levels:Array<Object> = [
      {num: 0, name: "AA"},
      {num: 1, name: "BB"}
  ];

  toNumber(){
    this.levelNum = +this.levelNum;
    console.log(this.levelNum);
  }
}
Gabu
  • 388
  • 2
  • 11
0

I think easiest solution would be to cast it to a number when you need to use it... Simple +this.levelNum will do. http://plnkr.co/edit/SxQfNlUB4RNdo2OndM9o

Sasxa
  • 40,334
  • 16
  • 88
  • 102