【问题标题】:Angular form is valid with unselected select角度形式对未选择的选择有效
【发布时间】:2016-06-16 12:55:56
【问题描述】:

我有一个带有选择的 Angular 表单,它被标记为必需。

当表单加载时,会显示选择区域消息以提示用户进行选择。

但是,即使没有有效的选择,表单也是有效的。

如果用户选择了一个有效选项,则选择选择一个区域表单验证会将表单标记为无效。

为什么表格一开始就无效?

代码:

<div ng-controller="MyCtrl">
  <form name="myForm">
    <select name="region" 
            ng-model="regionId"
            ng-options="region.id as region.name for region in regions" 
            ng-selected="region.id"
            required>
      <option value="">-- choose a region --</option>
    </select>
  </form>
</div>

控制器:

function MyCtrl($scope) {
  var myRegions = [{ id: 1, name: "England" }, 
                   { id: 2, name: "Wales" }, 
                   { id: 3, name: "Northern Ireland" }, 
                   { id: 4, name: "Scotland" }
                  ];
  $scope.regions = myRegions;
  $scope.regionId = 0;
}

这是jsfiddle 中的代码。

【问题讨论】:

    标签: angularjs forms


    【解决方案1】:

    您的表单有效,因为您设置了初始值$scope.regionId = 0;。只需将其删除或替换为$scope.regionId = "";

    jsfiddle 上的实时示例。

    angular.module('ExampleApp', [])
      .controller('ExampleController', function() {
        var vm = this;
        var myRegions = [{
          id: 1,
          name: "England"
        }, {
          id: 2,
          name: "Wales"
        }, {
          id: 3,
          name: "Northern Ireland"
        }, {
          id: 4,
          name: "Scotland"
        }];
        vm.regions = myRegions;
        vm.regionId = "";
      });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="ExampleApp">
      <div ng-controller="ExampleController as vm">
        <form name="myForm">
          isValid: {{myForm.$valid}}
          <br>
          <select name="region" ng-model="vm.regionId" ng-options="region.id as region.name for region in vm.regions" ng-selected="vm.region.id" required>
            <option value="">-- choose a region --</option>
          </select>
        </form>
      </div>
    </div>

    【讨论】:

    • 完美,谢谢。我知道我错过了一些明显的东西!
    【解决方案2】:

    您还应该考虑表单的$pristine 属性。请参阅下面的工作示例:

    angular.module("test", []).controller("MyCtrl", MyCtrl);
    
    function MyCtrl($scope) {
    
      var myRegions = [{
        id: 1,
        name: "England"
      }, {
        id: 2,
        name: "Wales"
      }, {
        id: 3,
        name: "Northern Ireland"
      }, {
        id: 4,
        name: "Scotland"
      }];
      $scope.regions = myRegions;
      $scope.regionId = 0;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
    
    <div ng-app="test" ng-controller="MyCtrl">
      <form name="myForm">
        <select name="region" ng-model="regionId" ng-options="region.id as region.name for region in regions" ng-selected="region.id" required>
          <option value="">-- choose a region --</option>
        </select>
        
      </form>
      
      <p ng-bind="regionId"></p>
      
      <hr>
      <span ng-show="!myForm.$pristine && myForm.$valid">Form Valid</span>
      <span ng-show="myForm.$pristine || myForm.$invalid">Form Invalid</span>
    </div>

    【讨论】:

    • 是的,我同意。但是,出于演示目的,代码示例被删减了。
    • 好吧,我没看实际原因。
    【解决方案3】:

    form-submission..

    如果您放置 提交按钮,您的表单将不再返回有效状态...您可以在表单标签中使用 ng-submit 属性来做到这一点会被你解雇的

    <input type="submit">
    

    或者您可以简单地将您添加到选择中的第一个选项保留为

      <option value="" disabled>-- choose a region --</option>
    

    此禁用将不允许它返回空值。

    此外,如果您想测试提交表单的东西,请运行下面的 sn-p。

    function MyCtrl($scope) {
    
      var myRegions = [
      		{ id: 1, name: "England" }, 
          { id: 2, name: "Wales" }, 
          { id: 3, name: "Northern Ireland" }, 
          { id: 4, name: "Scotland" }
          ];
      $scope.regions = myRegions;
      $scope.regionId = 0;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-controller="MyCtrl">
      <form name="myForm">
        <select name="region" 
                ng-model="regionId"
                ng-options="region.id as region.name for region in regions" 
                ng-selected="region.id"
                required>
          <option value="">-- choose a region --</option>
        </select>
        <input type="submit">
      </form>
      <p ng-bind="regionId"></p>
      <hr>
      <span ng-show="myForm.$valid">Form Valid</span>
      <span ng-show="myForm.$invalid">Form Invalid</span>
    </div>

    【讨论】:

    • 不,这行不通。我在整个页面上有一个提交按钮,但它不起作用。
    • 但是那个提交按钮是在表单标签外还是在表单标签内?
    • 我还提供了另一种解决方案来解决您的问题。 @KarlGjertsen
    • 添加禁用会停止第一个被选中的项目,这就是让它在那里的意义。
    • 这将确保不会通过表单传递空值..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2016-11-13
    • 2017-08-28
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多