2016-10-20 70 views
4

我試圖創建一個性別選擇視圖,有男性,女性和其他(caitlyn jenner類的東西)。Angular 2 - ngModel不檢查複選框

我現在有是這樣的:

enter image description here

有SVG旁邊的複選框的標籤(複選框將被隱藏在生產,現在可以看到在plunkr用於調試目的)

但當我點擊「女性」時,它會將焦點改爲複選框而不是檢查它。

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

代碼:

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); 
    } 

回答

5

您的實施有兩個問題。

  1. 這裏您不想使用[(ngModel)],因爲您正在更新控制器的值。只需將狀態反映到[checked]指令
  2. 複選框的狀態您不希望在此使用「for」屬性,因爲您已經在標籤上定義了點擊。這將觸發2次點擊,而不是一個(從「的」屬性1,1從(click)事件)

我更新了plunker從一個工作示例

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