Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular 2 - ngModel not checking Checkbox

I'm trying to create a gender selection view, having Male, Female and Other (caitlyn jenner kind of stuff).

What I currently have is this:

enter image description here

Having SVG next to the label of the checkbox (checkbox will be hidden in production, now visible in plunkr for debugging purpose)

But when I click on 'female' it changes focus to the checkbox instead of checking it.

Plunkr: http://plnkr.co/edit/Z0Dq2sfJaBrE6Mae2Kg1?p=info

Code:

css

svg { 
  width: 15px; height: 15px;

  border: 2px solid #a13b4a;
}
label {
  display: inline-block;
  padding-left: 1.5em;
  position: relative;
  cursor: pointer;
  color: black;

}
input[type="checkbox"] {
  opacity: 0;
  width: 15px;
  height: 15px;
}
label svg path {
  transition: stroke-dashoffset .4s linear;
}
input[type="checkbox"]:checked ~ label svg path {
  stroke-dashoffset: 0;
}
input[type="checkbox"]:checked ~ label {
  color: #a13b4a;
}

html

 <div>
                            <input type="checkbox" id="male" [(ngModel)]="isMale" name="isMale"/>
                            <label (click)="select('male')" for="male">Male
                                <svg (click)="select('male')" viewBox="0 0 60 40" xmlns="http://www.w3.org/2000/svg"><path d="M21,2 C13.4580219,4.16027394 
                                1.62349378,18.3117469 3,19 C9.03653312,22.0182666 25.2482171,10.3758914 30,8 C32.9363621,6.53181896 
                                41.321398,1.67860195 39,4 C36.1186011,6.88139893.11316157,27.1131616 5,29 C10.3223659,34.3223659 
                                30.6434647,19.7426141 35,18 C41.2281047,15.5087581 46.3445303,13.6554697 
                                46,14 C42.8258073,17.1741927 36.9154967,19.650702 33,22 C30.3136243,23.6118254 17,31.162498 
                                17,34 C17,40.4724865 54,12.4064021 54,17 
                                C54,23.7416728 34,27.2286213 34,37"
                                id="male-path" stroke-width="4" fill="none" stroke="#a14b4a" stroke-dasharray="270" stroke-dashoffset="270"></path></svg>
                            </label>
                        </div>
                        <div>
                            <input type="checkbox" id="female" [(ngModel)]="isFemale" [checked]="isFemale" name="isFemale"/>
                            <label for="female" (click)="select('female')">Female
                                <svg (click)="select('female')" viewBox="0 0 60 40" xmlns="http://www.w3.org/2000/svg"><path d="M21,2 C13.4580219,4.16027394 
                                1.62349378,18.3117469 3,19 C9.03653312,22.0182666 25.2482171,10.3758914 30,8 C32.9363621,6.53181896 
                                41.321398,1.67860195 39,4 C36.1186011,6.88139893.11316157,27.1131616 5,29 C10.3223659,34.3223659 
                                30.6434647,19.7426141 35,18 C41.2281047,15.5087581 46.3445303,13.6554697 
                                46,14 C42.8258073,17.1741927 36.9154967,19.650702 33,22 C30.3136243,23.6118254 17,31.162498 
                                17,34 C17,40.4724865 54,12.4064021 54,17 
                                C54,23.7416728 34,27.2286213 34,37"
                                id="female-path" stroke-width="4" fill="none" stroke="#a14b4a" stroke-dasharray="270" stroke-dashoffset="270"></path></svg>
                            </label>  
                        </div>
                        <div>
                            <input type="checkbox" id="other" [(ngModel)]="isOther" name="isOther"/>
                            <label for="other" (click)="select('other')">Other
                                <svg (click)="select('other')" viewBox="0 0 60 40" xmlns="http://www.w3.org/2000/svg"><path d="M21,2 C13.4580219,4.16027394 
                                1.62349378,18.3117469 3,19 C9.03653312,22.0182666 25.2482171,10.3758914 30,8 C32.9363621,6.53181896 
                                41.321398,1.67860195 39,4 C36.1186011,6.88139893.11316157,27.1131616 5,29 C10.3223659,34.3223659 
                                30.6434647,19.7426141 35,18 C41.2281047,15.5087581 46.3445303,13.6554697 
                                46,14 C42.8258073,17.1741927 36.9154967,19.650702 33,22 C30.3136243,23.6118254 17,31.162498 
                                17,34 C17,40.4724865 54,12.4064021 54,17 
                                C54,23.7416728 34,27.2286213 34,37"
                                id="other-path" stroke-width="4" fill="none" stroke="#a14b4a" stroke-dasharray="270" stroke-dashoffset="270"></path></svg>
                            </label>
                        </div>

TS

public isMale:boolean;
  public isFemale:boolean;
  public isOther:boolean;

  constructor() {
    this.isMale = true;
    this.isFemale = false;
    this.isOther = false;

  }
     select(gender:string){
        console.log("switch");
        switch(gender){
            case 'male': {
                console.log("male");
                this.isMale = true;
                this.isOther = false;
                this.isFemale = false;

                break;
            }
            case 'female' : {console.log("female");
                this.isFemale = true;
                this.isOther = false;
                this.isMale = false;

                break;
            }
            default: {console.log("default");
                this.isFemale = false;
                this.isMale = false;
                this.isOther = true;
            }
        }
        console.log("status: male:"+this.isMale+";;female:"+this.isFemale+";;other:"+this.isOther);
    }
like image 830
Ivar Reukers Avatar asked Oct 20 '16 10:10

Ivar Reukers


People also ask

Can we use ngModel with checkbox?

ng-model is used to get the selected checkboxes. Just set the different values to the ng-model and those will be used to check whether the element is selected or not.

What is checked in angular?

AngularJS ng-checked DirectiveThe ng-checked directive sets the checked attribute of a checkbox or a radiobutton. The checkbox, or radiobutton, will be checked if the expression inside the ng-checked attribute returns true. The ng-checked directive is necessary to be able to shift the value between true and false .


1 Answers

There are two issues with your implementation.

  1. You don't want to use [(ngModel)] here, because you are updating the value from your controller. Just reflect the state to the checkbox with the [checked] directive
  2. You don't want to use for "for" attribute here, because you already defined a click on the label. This will trigger 2 clicks instead of one (1 from the "for" attribute, and 1 from the (click) event)

I updated your plunker with a working example

http://plnkr.co/edit/y8qAbkBljG1TbVu5TKMX?p=preview

like image 72
koningdavid Avatar answered Sep 27 '22 21:09

koningdavid