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

标签 angularjs ng-messages

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

在以下情况下,如何显示复选框集和单选集的错误消息:

  • Radio set 中没有选择一个选项?
  • Checkbox set 中至少有一个选项没有被选中?
  • 缩放 Checkbox 集的检查,以便我们可以检查至少 2 个或更多被选中,等等?

  • 这是我的表格:
    <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>
    

    最佳答案

    检查此示例:

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

    复选框列表使用 ng-required带有 someSelected 的指令检查是否至少选择了一项的函数(在 Controller 中定义):

    <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条件为 !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>
    
    ngBlur指令解决了复选框列表只有在列表中的所有项目都被模糊时才会“触摸”的问题,调用 doTouched() 函数::
      $scope.doTouched = function() {
         $scope.userForm.subscribe.$setTouched();
      }
    

    附言注意正确的名称:userForm<form> 的 HTML 名称, user是绑定(bind)表单的模型的名称。

    关于angularjs - 如何使用 ng-messages 显示 Checkbox set 和 Radio set 的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34917981/

    相关文章:

    angularjs - 模态 Controller 中的 $setValidity [AngularJS]

    angularjs - 在 Angular e2e 测试中模拟 $httpBackend

    angularjs - 路由更改后无法专注于 Angular 表单文本输入

    javascript - ng-class 的这种(看似)意外行为背后的解释是什么?

    asp.net-mvc - 带有 MVC 的 AngularJS 模板

    angularjs - Angular 翻译指令不适用于 ngMessage

    validation - UI 选择表单属性 "touched"未在第一次交互时设置

    javascript - 一直显示错误信息。如何处理这个错误?

    angularjs - Angular ng-消息、错误、警告和表单有效性

    javascript - 如何在 td 内部重复数组,以便 td 包含所有数组值