天天看點

AngularJs表單驗證

轉載請注明出處 http://www.023996.cn/hyxw/s1129.html

Anjularjs表單驗證

  能夠根據使用者在表單中輸入的内容給出實時視覺回報是非常重要的。在人與人溝通的語境中,表單驗證給出來的回報同獲得正确輸入同等重要。

  表單驗證不僅能給使用者提供有用的回報,同時也能保護我們的Web應用不會被惡意或者錯誤的輸入所破壞。我們要在Web前端盡力保護後端。

  AngularJS能夠将HTML5表單驗證功能同它自己的驗證指令結合起來使用,并且非常友善。AngularJS提供了很多表單驗證指令。

<form name="form" novalidate>
    <label name="email">Your email</label>
    <input type="email" name="email" ng-model="email" placeholder="Email Address"/>
</form>      

要使用表單驗證,首先要確定表單像上面的例子一樣有一個 name 屬性。

  所有輸入字段都可以進行基本的驗證,比如最大、最小長度等。這些功能是由新的HTML5表單屬性提供的。

  如果想要屏蔽浏覽器對表單的預設驗證行為,可以在表單元素上添加 novalidate 标記

  1. 必填項 required 

  驗證某個表單輸入是否已填寫,隻要在輸入字段元素上添加HTML5标記 required 即可:

  注釋:required 屬性适用于以下 <input> 類型:text, search, url, telephone, email, password, date pickers, number, checkbox, radio 以及 file

<input type="text" required />      

   

  2. 最小長度 ng-minleng="{number}"

  驗證表單輸入的文本長度是否大于某個最小值,在輸入字段上使用AngularJS指令 ng-minleng="{number}" 

<input type="text" ng-minlength="5" />      

 

  3. 最大長度 ng-maxlength="{number}" 

  驗證表單輸入的文本長度是否小于或等于某個最大值,在輸入字段上使用AngularJS指令 ng-maxlength="{number}" 

<input type="text" ng-maxlength="20" />      

  4. 模式比對  ng-pattern="/PATTERN/"

  使用 ng-pattern="/PATTERN/" 來確定輸入能夠比對指定的正規表達式:

<input type="text" ng-pattern="[a-zA-Z]" />      

  

  5. 電子郵件

  驗證輸入内容是否是電子郵件,隻要像下面這樣将 input 的類型設定為 email 即可:

<input type="email" name="email" ng-model="user.email" />      

  6. 數字

  驗證輸入内容是否是數字,将 input 的類型設定為 number :

<input type="number" name="age" ng-model="user.age" />      

 7. URL

  驗證輸入内容是否是URL,将 input 的類型設定為 url :

<input type="url" name="homepage" ng-model="user.facebook_url" />      

在表單中控制變量

  表單的屬性可以在其所屬的 $scope 對象中通路到,而我們又可以通路 $scope 對象,是以JavaScript可以間接地通路DOM中的表單屬性。借助這些屬性,我們可以對表單做出實時(和AngularJS中其他東西一樣)響應。這些屬性包括下面這些。(注意,可以使用下面的格式通路這些屬性。)

  formName.inputFieldName.property

 ■未修改的表單

  這是一個布爾屬性,用來判斷使用者是否修改了表單。如果未修改,值為 true ,如果修改過值為 false

formName.inputFieldName.$pristine      

 ■修改過的表單

  隻要使用者修改過表單,無論輸入是否通過驗證,該值都傳回 true 

formName.inputFieldName.$dirty      

 ■合法的表單

  這個布爾型的屬性用來判斷表單的内容是否合法。如果目前表單内容是合法的,下面屬性的值就是 true :

formName.inputFieldName.$valid      

■ 不合法的表單

  這個布爾屬性用來判斷表單的内容是否不合法。如果目前表單内容是不合法的,下面屬性的值為 true :

formName.inputFieldName.$invalid      

■ 錯誤

  這是AngularJS提供的另外一個非常有用的屬性: $error 對象。它包含目前表單的所有驗證内容,以及它們是否合法的資訊。用下面的文法通路這個屬性:

formName.inputfieldName.$error      

$parsers

  當使用者同控制器進行互動,并且 ngModelController 中的 $setViewValue() 方法被調用時,$parsers 數組中的函數會以流水線的形式被逐個調用。第一個 $parse 被調用後,執行結果會傳遞給第二個 $parse ,以此類推

  這些函數可以對輸入值進行轉換,或者通過 $setValidity() 函數設定表單的合法性。

  使用 $parsers 數組是實作自定義驗證的途徑之一。

  例如,假設我們想要確定輸入值在某兩個數值之間,可以在 $parsers 數組中入棧一個新的函數,這個函數會在驗證鍊中被調用。

  每個 $parser 傳回的值都會被傳入下一個 $parser 中。當不希望資料模型發生更新時傳回undefined 。

 html 

<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>表單測試</title>
    <link rel="stylesheet" href="">
    <script type="text/javascript" src="angular.1.2.13.js"></script>
</head>
<body>
    <div ng-controller="TestController">
        <form name="testForm">
            <input type="number" name="inputs" ng-test ng-model="obj.number">
            <span ng-show="testForm.inputs.$error.test">good</span>
            <span ng-hide="testForm.inputs.$error.test">bad</span>
            <div>{{ testForm.inputs.$valid }}</div>
            <div>{{ testForm.inputs.$invalid }}</div>
            <div>{{ obj.number }}</div>
        </form>
    </div>
    <script type="text/javascript" src="test5app.js"></script>
</body>
</html>      

javascript  ( test5app.js )

angular.module('myApp', []).controller('TestController', function($scope) {
    $scope.obj = {
        number: 34
    }
}).directive('ngTest', function() {
    return {
        require: '?ngModel',
        restrict: 'AE',
        link: function($scope, iElm, iAttrs, ngModel) {
            if (!ngModel) return;
            ngModel.$parsers.push(function(viewValue) {
                var num = parseInt(viewValue);
                if (num >= 0 && num < 99) {
                    ngModel.$setValidity('test', true);
                    return viewValue
                } else {
                    ngModel.$setValidity('test', false);
                    return undefined
                }
            })
        }
    }
});      

轉載于:https://www.cnblogs.com/andyhxl/p/7688226.html

繼續閱讀