如何使用ng-messages显示Checkbox集和Radio set的错误消息?

时间:2016-01-21 07:42:29

标签: angularjs ng-messages

我一直在尝试验证Checkbox set和Radio set并使用ng-messages指令显示错误消息,但它没有按预期工作。 ng-messages根本不显示错误消息。我正在使用html文件填充错误消息。在解决错误之前,我的表单中将禁用提交按钮。

如何在以下情况下显示Checkbox集和Radio set的错误消息:

  1. 在收音机中未选择一个选项?

  2. 复选框设置中未选择至少一个选项?

  3. 检查Checkbox集的检查是否可以检查至少2个或更多,等等?

  4. 这是我的表单:

    <form name="userForm" ng-submit="submitForm()" novalidate>
        <div class="form-group" ng-class="{ 'has-error' : userForm.subscribe.$invalid && !userForm.subscribe.$touched }">
            <label class="checkbox-inline">
                <input type="checkbox" id="subscribe1" value="option1" name="subscribe[]" ng-model="user.subscribe" required> 1
            </label>
            <label class="checkbox-inline">
                <input type="checkbox" id="subscribe2" value="option2" name="subscribe[]" ng-model="user.subscribe" required> 2
            </label>
            <label class="checkbox-inline">
                <input type="checkbox" id="subscribe3" value="option3" name="subscribe[]" ng-model="user.subscribe" required> 3
            </label>
    
            <div class="help-block" ng-messages="userForm.subscribe.$error" ng-show="userForm.subscribe.$invalid">
                <div ng-messages-include="home/messages.html"></div>
            </div>
        </div>
    
        <div class="form-group" ng-class="{ 'has-error' : userForm.gender.$invalid && !userForm.gender.$touched }">
            <div class="radio">
                <label>
                    <input type="radio" name="gender" value="male" ng-model="user.gender" />
                    male
                </label>
            </div>
            <div class="radio">
                <label>
                    <input type="radio" name="gender" value="female" ng-model="user.gender" />
                    female
                </label>
            </div>
    
            <div class="help-block" ng-messages="userForm.gender.$error" ng-show="userForm.gender.$invalid">
                <div ng-messages-include="home/messages.html"></div>
            </div>
        </div>
        <button type="submit" class="btn btn-primary btn-success " ng-disabled="userForm.$invalid">Submit</button>
    </form>
    

    messages.html

    <span ng-message="required">This field is required</span>
    <span ng-message="minlength">This field is too short</span>
    <span ng-message="maxlength">This field is too long</span>
    <span ng-message="required">This field is required</span>
    <span ng-message="email">This needs to be a valid email</span>
    

    controller.js

    angular.module('myApp', ['ngRoute', 'ngAnimate', 'ngMessages']);
    
    angular
        .module('myApp')
        .controller('HomeCtrl', HomeCtrl);
    
    HomeCtrl.$inject = ['$scope'];
    
    function HomeCtrl($scope) {
        $scope.userForm = {};
    }
    

    付款复选框设置:

    <div class="form-group" ng-class="{ 'has-error' : userForm.payment.$invalid && userForm.payment.$touched }">
        <label class="checkbox-inline">
            <input type="checkbox" id="payment1" value="Visa" name="payment" ng-blur="doTouched()" ng-model="user.payment[1]" ng-required="!someSelected(user.payment)"> Visa
        </label>
        <label class="checkbox-inline">
            <input type="checkbox" id="payment2" value="Mastercard" name="payment" ng-blur="doTouched()" ng-model="user.payment[2]" ng-required="!someSelected(user.payment)"> Mastercard
        </label>
        <label class="checkbox-inline">
            <input type="checkbox" id="payment3" value="Cash" name="payment" ng-blur="doTouched()" ng-model="user.payment[3]" ng-required="!someSelected(user.payment)"> Cash
        </label>
    
        <div class="help-block" ng-messages="userForm.payment.$error" ng-show="userForm.payment.$invalid && userForm.payment.$touched">
            <div ng-messages-include="home/messages.html"></div>
        </div>
    </div>
    

2 个答案:

答案 0 :(得分:6)

检查此样本:

http://plnkr.co/edit/2w0lIf?p=preview

复选框列表使用ng-required指令和someSelected函数(在控制器中定义),该函数检查是否至少选择了一个项目:

<div class="form-group" ng-class="{ 'has-error' : userForm.subscribe.$invalid && userForm.subscribe.$touched }">
    <label class="checkbox-inline">
        <input type="checkbox" id="subscribe1" value="option1" name="subscribe" ng-blur="doTouched()" ng-model="user.subscribe[1]" ng-required="!someSelected(user.subscribe)"> 1
    </label>
    <label class="checkbox-inline">
        <input type="checkbox" id="subscribe2" value="option2" name="subscribe" ng-blur="doTouched()" ng-model="user.subscribe[2]" ng-required="!someSelected(user.subscribe)"> 2
    </label>
    <label class="checkbox-inline">
        <input type="checkbox" id="subscribe3" value="option3" name="subscribe" ng-blur="doTouched()" ng-model="user.subscribe[3]" ng-required="!someSelected(user.subscribe)"> 3
    </label>

    <div class="help-block" ng-messages="userForm.subscribe.$error" ng-show="userForm.subscribe.$invalid && userForm.subscribe.$touched">
        <div ng-messages-include="messages.html"></div>
    </div>
</div>

选项按钮组更容易,并使用条件为ng-required的{​​{1}}指令:

!user.gender

<div class="form-group" ng-class="{ 'has-error' : userForm.gender.$invalid && userForm.gender.$touched }"> <div class="radio"> <label> <input type="radio" name="gender" value="male" ng-model="user.gender" ng-required="!user.gender"/> male </label> </div> <div class="radio"> <label> <input type="radio" name="gender" value="female" ng-model="user.gender" ng-required="!user.gender"/> female </label> </div> <div class="help-block" ng-messages="userForm.gender.$error" ng-if="userForm.gender.$touched"> <div ng-messages-include="messages.html"></div> </div> </div> 指令解决了只有当列表中的所有项都模糊时,复选框列表才会被“触摸”的问题,调用doTouched()函数::

ngBlur

PS 注意正确的名称: $scope.doTouched = function() { $scope.userForm.subscribe.$setTouched(); } userForm的HTML名称,<form>是绑定到的模型的名称形式。

答案 1 :(得分:0)

这是我创建的一个例子,它符合我们的目的。
我们的应用程序会在每个页面上创建多个复选框问题,并且$ touch似乎不适用于所有具有相同名称属性的输入复选框字段。
我在复选框中看到的自定义角度插件/指令也很好(它们只绑定到1个数组模型)但似乎不支持“必需”。

在这里,我通过ng-click设置每个问题的custom_touched事件:

http://jsfiddle.net/armyofda12mnkeys/9gLndp5y/7/

<li ng-repeat="choice in currentquestion.choices">
                  <input
                    type="checkbox"
                    ng-model="choice.selected"
                    ng-required="!somethingSelectedInTheGroup(currentquestion.required, currentquestion.choices)"
                    ng-click="currentquestion.custom_touched = true;"
                    name="{{currentquestion.question_code}}"
                    id="{{currentquestion.question_code}}_{{choice.option_value}}"                                      
                    value="{{choice.option_value}}"
                  /> {{choice.orig_option_txt}}

              </li> 


$scope.somethingSelectedInTheGroup = function (is_required, choices) {
    if(is_required) {
      for(var i = 0; i < choices.length; i++) {
        var choice = choices [i];
        if(choice.selected) {
            return true;
        }
      }

      return false;
    } else {
        return false;
    }
  }

注意:我最初使用<div ng-if="questionform.$dirty && questionform[currentquestion2.question_code].$invalid"> 但是对于每个表单/页面的多个复选框问题,这不起作用。