2012-11-26 63 views
33

我試過使用HTML5 required屬性爲我的複選框組,但我沒有找到一個很好的方式來實現它與ng形式。使用複選框,並需要與AngularJS

當一個複選框被選中時,我希望該input-element的值被推送到一個值數組中。

角度需求驗證器似乎在觀察與輸入元素相關聯的ng模型,但是如何將幾個複選框鏈接到同一模型並使用輸入字段的值更新其值?

現在的實施就像this fiddle

<div ng-controller="myCtrl"> 
    <ng-form name="myForm"> 
    <span ng-repeat="choice in choices"> 
     <label class="checkbox" for="{{choice.id}}"> 
     <input type="checkbox" required="required" value="{{choice.id}}" ng-click="updateQuestionValue(choice)" ng-model="choice.checked" name="group-one" id="{{choice.id}}" /> 
     {{choice.label}} 
     </label> 
    </span> 
    <input type="submit" value="Send" ng-click="submitSurvey(survey)" ng-disabled="myForm.$invalid" /> 
    </ng-form> 
</div>​ 

的updateQuestionValue功能處理添加或從值陣列卸下但每個複選框有它自己的模式,這就是爲什麼每個複選框需要以被檢查的形式是有效的。

我已經得到它在一組單選按鈕上工作,但它們都在相同的模型上工作,因爲只有一個可以選擇。

+0

我使用Angular v1.2.1在一個小時內將我的頭撞到牆上一個小時,直到在1.2.10上嘗試它爲止。似乎現在已經修好了。 – alalonde

回答

35

如果你想,如果沒有選擇的選擇,最簡單的方法是檢查在NG-disabled屬性的數組的長度,沒有設置必要的屬性

<input type="submit" value="Send" ng-click="submitSurvey(survey)" 
ng-disabled="value.length==0" /> 
提交按鈕被禁用

See here for updated fiddle

另一種方式來做到這一點是檢查數組長度中的複選框的NG要求的屬性

<input type="checkbox" value="{{choice.id}}" ng-click="updateQuestionValue(choice)" 
    ng-model="choice.checked" name="group-one" id="{{choice.id}}" 
    ng-required="value.length==0" /> 

Second fiddle

+0

謝謝!我現在用你的第二個解決方案來解決這個問題。 – Tryggve

+0

@mark,我最近採用了這個解決方案,謝謝。 –

5

有幾件事情:

  • 我會去與剛剛更新了在這種情況下,整個陣列,因爲這將簡化代碼一點的方法。 (如果你對$ scope.value數組內容做了任何有狀態的事情,你可能不想這樣做,但它看起來不像你)。
  • 您可以使用<form>而不是<ng-form>
  • 將提交功能從按鈕的ng-click移開並移入表單的ng-submit。這使驗證管理與角度的內置驗證(如果你關心的話)更容易一些
  • 如果您的<label>包裝您的<input>您不需要for=""屬性。

Here is an updated fiddle for you

而這裏的代碼:

<div ng-controller="myCtrl"> 
    <form name="myForm" ng-submit="submitSurvey(survey)"> 
     <span ng-repeat="choice in choices"> 
      <label class="checkbox"> 
      <input type="checkbox" required="required" value="{{choice.id}}" ng-change="updateQuestionValues()" ng-model="choice.checked" name="group-one" /> 
       {{choice.label}} 
      </label> 
     </span> 
     <input type="submit" value="Send" ng-disabled="myForm.$invalid" /> 
    </form> 
    {{value}} 
</div>​ 

JS

function myCtrl($scope) { 

    $scope.choices = [{ 
     "id": 1, 
     "value": "1", 
     "label": "Good"}, 
    { 
     "id": 2, 
     "value": "2", 
     "label": "Ok"}, 
    { 
     "id": 3, 
     "value": "3", 
     "label": "Bad"}]; 

    $scope.value = []; 

    $scope.updateQuestionValues = function() { 
     $scope.value = _.filter($scope.choices, function(c) { 
      return c.checked; 
     }); 
    }; 
}​ 
+0

嗨!感謝您的想法,我會重構我的最終實施。但我不明白這是如何幫助我解決最初的問題?我仍然需要在'myForm。$ invalid == false'之前檢查所有三個複選框。 – Tryggve

2

爲什麼不把你的複選框車型陣列

<input type="checkbox" ng-model="value[$index]" value="{{choice.id}}/> 

小提琴:http://jsfiddle.net/thbkA/1/

+1

謝謝,這是一個很好的解決方案,但它仍然無助於我的最初問題,爲了使Angular標記我的表單有效,我需要使所有三個複選框被檢查。 – Tryggve

+0

@Tryggve,結帳這個問題:http://stackoverflow.com/questions/16289248/bind-json-object-to-radio-button-in-angularjs – b1r3k

5

我只是添加了NG-model的隱藏輸入這是與您的NG-模型的單選按鈕:

<div class="radio" ng-repeat="option in item.AnswerChoices | orderBy: DisplayOrder"> 
     <input type="radio" ng-model="item.Answer" name="mulchoice" value="{{option.DisplayName}}" /> 
     <span>{{option.DisplayName}}</span> 
    <input type="hidden" ng-model="item.Answer" name="hiddenradiobuttoninput" required/> 
</div> 
+0

這是一個很棒的解決方案!我通過在複選框中使用'ng-true-value =''我同意'「ng-false-value =」「'對其進行了一些改進。這樣,如果他們檢查,然後取消選中,表單將恢復爲無效。 (沒有添加這個,用戶可以檢查該框,然後取消選中它,並且隱藏的值變爲「false」,這對於需要的隱藏字段來說是技術上有效的值)。 – solidau

+0

oops剛剛意識到您的答案正在使用radio '複選框'。我的改進只對'checkbox'有效 – solidau

0
<ul class="list-group"> 
    <li ng-repeat='animal in animals' class="list-group-item"> 
    <label> 
     <input type="checkbox" 
     ng-model="xyx" 
     ng-click="toggleAnimal(animal)" 
     ng-checked="selectedAnimals.indexOf(animal) > -1" 
     ng-required="selectedAnimals.length == 0" /> 
     {{animal}}</label> 
    </li>     
</ul> 

$scope.toggleAnimal = function(animal){ 
    var index = $scope.selectedAnimals.indexOf(animal); 
    if(index == -1) { 
     $scope.selectedAnimals.push(animal); 
    } 
    else{ 
     $scope.selectedAnimals.splice(index, 1); 
    } 
} 

查看完整的細節和demo and other related examples