【问题标题】:AngularJS validation on html page is not workinghtml页面上的AngularJS验证不起作用
【发布时间】:2017-01-04 11:26:43
【问题描述】:

我必须创建 AngularJS 项目。在这我有一个 html 页面名称是 addNewHost.html

我的 addNewHost.html 代码如下

<md-content class="md-padding" ng-controller="AddNewHostController as vm">
    <form name="hostForm" ng-submit="vm.AddNewHost($event)" novalidate>
        <md-content md-theme="dark" class="md-padding" layout="row" layout-sm="column">
            <md-input-container>
                <label>Hostame</label>
                <input ng-model="vm.service.hostname" required>
            </md-input-container>
            <md-input-container>
                <label>IP Address</label>
                <input ng-model="vm.service.ipaddress" required>
            </md-input-container>
            <md-input-container>
                <label>Alias</label>
                <input ng-model="vm.service.alias" required>
            </md-input-container>
        </md-content>
        <md-content class="md-padding">
            <div layout layout-sm="column">
                <md-input-container flex>
                    <input ng-model="vm.service.check_command" placeholder="Check Command" required>
                </md-input-container>
                <md-input-container flex>
                    <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.notification_period"
                        name="notification_period" required>
                        <option value="">Select notification period</option>
                        <option value="24x7">24x7</option>
                    </select>
                </md-input-container>
                <md-input-container flex>
                    <label>Max check attempts</label>
                    <input ng-model="vm.service.max_check_attempts" required name="max_check_attempts">
                </md-input-container>
            </div>
            <div layout layout-sm="column">
                <md-input-container flex>
                    <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.active_checks_enabled"
                        name="active_checks_enabled" required name="active_checks_enabled">
                        <option value="">Select active checks enabled</option>
                        <option value="1">On</option>
                        <option value="0">Off</option>
                        <option value="2">Skip</option>
                        <option value="3">Null</option>
                    </select>
                </md-input-container>
                <md-input-container flex>
                    <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.passive_checks_enabled"
                        name="passive_checks_enabled" required>
                        <option value="">Select passive checks enabled</option>
                        <option value="1">On</option>
                        <option value="0">Off</option>
                        <option value="2">Skip</option>
                        <option value="3">Null</option>
                    </select>
                </md-input-container>
                <md-input-container flex>
                    <md-checkbox name="chkRegister" ng-model="vm.service.register">Registered</md-checkbox>
                </md-input-container>
            </div>
            <div layout layout-sm="column">
                <md-input-container flex>
                    <input ng-model="vm.service.chIntervalInMinutes" placeholder="Check interval in minutes" required>
                </md-input-container>
                <md-input-container flex>
                    <input ng-model="vm.service.retryIntervalInMinutes" placeholder="Retry interval in minutes" required>
                </md-input-container>
                <md-input-container flex>
                    <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.contact_groups"
                        name="contact_groups" required>
                        <option value="">Select contact groups</option>
                        <option value="admins">admins</option>
                    </select>
                </md-input-container>
            </div>
            <div layout layout-sm="column">
                <md-input-container flex>
                    <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.check_period"
                        name="check_period" style="width:33%;" required>
                        <option value="">Select check period</option>
                        <option value="24x7">24x7</option>
                    </select>
                </md-input-container>
            </div>
            <button class="md-button md-ink-ripple" ng-class="hostForm.$valid ? 'active' : 'disable'" style="background-color:#7ec9c2; height: 12px; margin-top: 3%;">Add Host Service</button>
        </md-content>
    </form>
</md-content>

我的 AddNewHostController 控制器代码如下

(function(){
  angular
    .module('app')
    .controller('AddNewHostController', [
      AddNewHostController
    ]);

  function AddNewHostController() {
    var vm = this
    vm.AddNewHost = AddNewHost;

    function AddNewHost() {
      console.log(vm.service);
      if (vm.service == undefined) {
        return false;
      } else {
        console.log(vm.service);
      }
    }
  }
})();

我的问题是

当我点击我的提交按钮(添加主机服务)时,它将执行控制器而不检查验证。

简而言之,我的验证不起作用。

我还有其他问题是,当我点击提交按钮时,它不会验证我的所有下拉列表。

【问题讨论】:

  • 您尝试过从表单中删除 novalidate 吗?
  • @federicoscamuzzi 我不想显示 html 弹出窗口。我希望当我点击提交时,它会做所有空的所需文本框和红色下拉菜单。
  • 你为什么说弹出??? ..我没有提到它..我建议你从你的 标签中删除 novalidate 指令..这样做:
  • @federicoscamuzzi 如果我删除 novalidate ,它会向我显示 html 所需的弹出窗口和所需的输入。你明白我的意思了吗?

标签: angularjs


【解决方案1】:

首先,由于您使用的是angular-material,请查看官方页面上的error handling example

  • 确保已将 ngMessages 添加为项目的依赖项。
  • 从您的 HTML 标记中删除手动添加的 ng-pristineng-dirtyng-valid 类,这些类是由 Angular 的验证机制自动添加的。
  • 然后检查您的输入是否可以检测到无效值并相应地更改其样式,如官方示例所示。

一旦您开始工作,下一步就是确保您不启用提交按钮,除非表单有效。我看到您选择通过 ng-class 执行此操作,但是我建议您使用 ng-disabled 指令,如 here 所示。

<button type="submit" class="md-button md-ink-ripple" ng-disabled="hostForm.$invalid">Add Host Service</button>

第三,您还可以在控制器内部添加一个安全开关,如上面同一链接中所述。因此,修改您的表单标记如下:

<form name="hostForm" ng-submit="vm.AddNewHost(hostForm.$valid)" novalidate>

和你的控制器方法成

function AddNewHost(isDataValid) {
  if (isDataValid) {
    // add your host
  }
}

【讨论】:

  • 你是对的。这对我有用,但我面临一些问题。在我的页面加载时,我的控制台上出现了一些错误“错误:$StateProvider.$get 取代了过渡”。你能帮我解决这个问题吗?
  • 当我点击提交按钮时,我的所有文本框颜色都转换为红色,但我的下拉菜单颜色没有改变?
  • `$StateProvider' 错误是完全不同的东西,超出了本文的范围。和UI-Router的使用有关,可以找一些线索here。我建议您创建一个新的、单独的帖子,详细说明 UI-Router 在您的应用程序中的使用方式以及错误发生的时间。
  • 对于提交按钮,有点不清楚问题是什么。您的文本框是否仅在它们具有无效值时才变为红色,或者无论其有效状态如何?
  • 为确保下拉菜单显示验证错误,它们必须既无效又被触摸,如official Angular Material documentation,验证部分所述。您的原始代码应使用md-select 而不是标准选择,还应添加ng-messages 的占位符,如图所示。
【解决方案2】:

不确定您是如何做到的,但请与下面的示例进行比较。

这也是一个有效的plunk。验证在 plunk 中运行良好。

交叉检查您正在使用的所有版本。

var app = angular.module('simple', ['ngMaterial']);


app.controller("AddNewHostController", function($scope) {
  $scope.service = {};
});
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <title>AngularJS Plunker</title>
  <script>
    document.write('<base href="' + document.location + '" />');
  </script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">

  <link rel="stylesheet" href="style.css" />


  <!-- Angular Material requires Angular.js Libraries -->
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>

  <!-- Angular Material Library -->
  <script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.js"></script>
  <script src="app.js"></script>
</head>

<body ng-app="simple">
  <md-content class="md-padding" ng-controller="AddNewHostController as vm">
    <form name="hostForm" ng-submit="vm.AddNewHost($event)" novalidate="">
      <md-content md-theme="dark" class="md-padding" layout="row" layout-sm="column">
        <button class="md-button md-ink-ripple" ng-class="hostForm.$valid ? 'active' : 'disable'" style="background-color:#7ec9c2; height: 12px; margin-top: 3%;">Add Host Service</button>
        <md-input-container>
          <label>Hostame</label>
          <input ng-model="vm.service.hostname" required="" />
        </md-input-container>
        <md-input-container>
          <label>IP Address</label>
          <input ng-model="vm.service.ipaddress" required="" />
        </md-input-container>
        <md-input-container>
          <label>Alias</label>
          <input ng-model="vm.service.alias" required="" />
        </md-input-container>
      </md-content>
      <md-content class="md-padding">
        <div layout="" layout-sm="column">
          <md-input-container flex="">
            <input ng-model="vm.service.check_command" placeholder="Check Command" required="" />
          </md-input-container>
          <md-input-container flex="">
            <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.notification_period" name="notification_period" required="">
              <option value="">Select notification period</option>
              <option value="24x7">24x7</option>
            </select>
          </md-input-container>
          <md-input-container flex="">
            <label>Max check attempts</label>
            <input ng-model="vm.service.max_check_attempts" required="" name="max_check_attempts" />
          </md-input-container>
        </div>
        <div layout="" layout-sm="column">
          <md-input-container flex="">
            <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.active_checks_enabled" name="active_checks_enabled" required="">
              <option value="">Select active checks enabled</option>
              <option value="1">On</option>
              <option value="0">Off</option>
              <option value="2">Skip</option>
              <option value="3">Null</option>
            </select>
          </md-input-container>
          <md-input-container flex="">
            <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.passive_checks_enabled" name="passive_checks_enabled" required="">
              <option value="">Select passive checks enabled</option>
              <option value="1">On</option>
              <option value="0">Off</option>
              <option value="2">Skip</option>
              <option value="3">Null</option>
            </select>
          </md-input-container>
          <md-input-container flex="">
            <md-checkbox name="chkRegister" ng-model="vm.service.register">Registered</md-checkbox>
          </md-input-container>
        </div>
        <div layout="" layout-sm="column">
          <md-input-container flex="">
            <input ng-model="vm.service.chIntervalInMinutes" placeholder="Check interval in minutes" required="" />
          </md-input-container>
          <md-input-container flex="">
            <input ng-model="vm.service.retryIntervalInMinutes" placeholder="Retry interval in minutes" required="" />
          </md-input-container>
          <md-input-container flex="">
            <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.contact_groups" name="contact_groups" required="">
              <option value="">Select contact groups</option>
              <option value="admins">admins</option>
            </select>
          </md-input-container>
        </div>
        <div layout="" layout-sm="column">
          <md-input-container flex="">
            <select class="ng-pristine ng-valid md-input ng-empty ng-touched" ng-model="vm.service.check_period" name="check_period" style="width:33%;" required="">
              <option value="">Select check period</option>
              <option value="24x7">24x7</option>
            </select>
          </md-input-container>
        </div>
      </md-content>
    </form>
  </md-content>
</body>

</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2011-09-27
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多