<select> 上的 AngularJS 验证,带有提示选项

Posted

技术标签:

【中文标题】<select> 上的 AngularJS 验证,带有提示选项【英文标题】:AngularJS Validation on <select> with a prompt option 【发布时间】:2014-01-18 11:34:50 【问题描述】:

我有以下代码用于在 Bootstrap 中设置样式的选择下拉输入。

<select class="form-control" name="businessprocess" ng-model="businessprocess" required>
    <option value="">-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

在用户能够提交此表单之前,他或她必须选择一个业务流程。

所以我将required 指令放在select 语句中,但是因为第一个选项标记有-- Select Business Process -- 仍然算作选定选项,因此满足了所需的标志,因此表单验证即使没有选择实际的业务流程。

我该如何解决这个问题?

谢谢。

【问题讨论】:

您能否创建一个带有链接属性的属性指令,该指令将为 onchange 事件 ant 设置一个侦听器并在那里验证内容? 【参考方案1】:

这种方法可以/应该解决您的问题:

1) 在你的范围内声明选项:

$scope.processes = [
     code: "C", name: "Process C" ,
     code: "Q", name: "Process Q" 
];

并且 2) 使用这个声明:

<select class="form-control" name="businessprocess" ng-model="businessprocess" required
    ng-options="c.code as c.name for c in processes" >
    <option value="">-- Select Business Process --</option>
</select>

这里的诀窍实际上是,在角度周期内,首先会解决当前值不在processes 选项中的问题。因此,默认设置为:

&lt;option value=""&gt;-- Select Business Process --&lt;/option&gt;

required 将按预期工作(more details)

【讨论】:

这都是关于在您的 html 中使用空 【参考方案2】:

你可以在控制器中初始化选择器的值:

<select class="form-control" name="businessprocess" ng-model="businessprocess">
    <option value="A">-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

在控制器中:

$scope.businessprocess = "A" ;

或“C”、“Q”,随心所欲,因此选择始终具有价值。我认为您在选择中不需要“必需”。

如果你不想要一个初始化值。当用户不选择它时也会做一些额外的效果。

<select class="form-control" name="businessprocess" ng-model="businessprocess" myRequired>
    <option value="">-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

然后编写指令:

model.directive("myRequired", function() 
    return 
        restrict: 'AE',
        scope: ,
        require: 'ngModel',
        link: function(scope, iElement, iAttrs) 
                if(iElement.val() == "")
                    //do something
                    return;
                 else 
                    //do other things
                
            );
        
    ;
);

【讨论】:

我明白了,但我故意希望用户选择一些东西。我不希望那里有默认值。 我已经重新编辑了我的答案,希望对你有用。【参考方案3】:

JS

angular.module('interfaceApp') .directive('requiredSelect', function () return restrict: 'AE', require: 'ngModel', link: function(scope, elm, attr, ctrl) if (!ctrl) return; attr.requiredSelect = true; // force truthy in case we are on non input element var validator = function(value) if (attr.requiredSelect && ctrl.$isEmpty(value)) ctrl.$setValidity('requiredSelect', false); return; else ctrl.$setValidity('requiredSelect', true); return value; ; ctrl.$formatters.push(validator); ctrl.$parsers.unshift(validator); attr.$observe('requiredSelect', function() validator(ctrl.$viewValue); ); ; );

【讨论】:

【参考方案4】:

最好的方法是使用:

HTML

<select name="businessprocess" ng-model="businessprocess"  required>
        <option selected disabled value="">-- Select Business Process --</option>
        <option ng-repeat="v in processes" value="v.id">v.value</option>
</select>

【讨论】:

【参考方案5】:

您可以尝试添加表单,例如:

HTML

<div ng-app="myApp" ng-controller="MyCtrl">
     <form name="mainForm">
    <select name="businessprocess" ng-model="businessprocess"  required>    
        <option value="">-- Select Business Process --</option>
        <option ng-repeat="v in processes" value="v.id">v.value</option>
    </select>
    <span class="error" ng-show="mainForm.businessprocess.$error.required">required</span>
</form>
</div>

js

angular.module('myApp', []);

function MyCtrl($scope, $timeout) 
   $scope.processes = [
        id: "C",
        value: "Process C"
    , 
        id: "Q",
        value: "Process Q"
    ];

演示Fiddle

【讨论】:

【参考方案6】:

使用下面的代码sn-p

<select class="form-control" name="businessprocess" ng-model="businessprocess">
    <option value="A" disabled selected hidden>-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

【讨论】:

【参考方案7】:

将“禁用”添加到第一个选项:

<select class="form-control" name="businessprocess" ng-model="businessprocess" required>
<option value="" disabled>-- Select Business Process --</option>
<option value="C">Process C</option>
<option value="Q">Process Q</option>

【讨论】:

【参考方案8】:

这对我有用。除非用户选择“选择...”以外的任何其他值,否则表单无效

<select name="country" id="country" class="form-control" formControlName="country" required>
    <option selected value="">Choose...</option>
    <option *ngFor="let country of countries">country.country</option>
</select>

【讨论】:

【参考方案9】:

也许这段代码对此有用...在这种情况下,表单称为 myform

<select ng-model="selectX" id="selectX" name="selectX"  required>
                                            <option  value="" ></option>
                                            <option  value="0" >0</option>
                                            <option value="1">1</option>
                                          </select>

    <span style="color:red" ng-show="myform.selectX.$dirty && myform.selectX.$invalid">
    <span ng-show="myform.selectX.$error.required">Is required.</span>
    </span> 

【讨论】:

以上是关于<select> 上的 AngularJS 验证,带有提示选项的主要内容,如果未能解决你的问题,请参考以下文章

Angular HTML Select 选项禁用和启用

angular ui-grid-selection 如何获取已选择行的数据,如ID,包括多选

为 mat-select 预选多个值 - Angular 6

angular 为select赋值时为啥不会触发ng-change

Angular4(更改)事件不适用于 jQuery select2?

select2 事件在 angular4 中触发两次