AngularJS form表單驗證(非常全面)

來源:互聯網
上載者:User

構建一個ng表單

1.確保form上標籤有一個name屬性,像下面的例子一樣。最好再加一個novalidate=”novalidate”

2.form中不能有action屬性。提交交由ng-submit處理

3.每個input一定要有ng-model,最好有一個name方便引用。然後用require或者ng-minlength之類才起作用

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


ng預設提供了驗證

驗證是否已輸入文字,只需在標籤上加上required:


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

驗證至少輸入{number}個字元,使用指令ng-minlength=“{number}”:


<input type="text" ng-model="user.name" ng-minlength="5" />

驗證至多輸入{number}個字元,使用指令ng-maxlength=“{number}”:


<input type="text" ng-model="user.name" ng-maxlength="20" />

確保輸入匹配一個Regex,使用指令ng-pattern="/PATTERN/":


<input type="text" ng-model="user.name" ng-pattern="/a-zA-Z/" />

驗證輸入是一個Email,設定input的type屬性為email:

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

驗證輸入是一個數字,設定input的type屬性為number:

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

驗證輸入是一個URL,設定input的type屬性為url

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


實戰一個例子(需要驗證一個email為發須並且最小為10,最長為20,並且並須要含有m字元。沒有實際意義,只是示範例子)

<!doctype html>
<html ng-app="myApp">
<head>
 <meta charset="UTF-8">
 <title>表單</title>
</head>
<body>
<form name="form" novalidate="novalidate">
 <input type="email" ng-model="user.email" ng-minlength="5" ng-maxlength="20" ng-pattern="/m.*/" required/>
 <input type="submit" value="確定"/>
</form>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
 var myApp = angular.module('myApp', []);
</script>
</body>
</html>

運行這個例子先啥都不做,查看元素

 

注意看這些標出來的東西有點意思。然後輸入字元就能看到他們的進行變化。然後我來解釋一下這些東西。(可以看到一開始required就為ng-invalid-required。但其他的都為valid)

驗證的時候感覺好像出現一個bug.具體如下:(如有知道的請協助一下解釋一下這個問題)

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表單</title>
</head>
<body>
<form name="form" novalidate="novalidate">
    <input type="email" ng-model="user.email" ng-minlength="5" ng-maxlength="20" ng-pattern="/m.*/" required/>
    <input type="email" ng-model="user.email2"  required/>
    <input type="submit" value="確定"/>
</form>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
</script>
</body>
</html>


第一個例子的email居然ng-valid-email。感覺有點問題。難道是用了type=”email”之類就不能用ng-minlength ng-pattern之類了嗎?覺得可能是ng版本問題,但換了低版本之後發現同樣有問題。希望有人能解釋一下這個問題。github有這個問題 https://github.com/angular/angular.js/issues/7849 而且email驗證的時候github上有人提出了其他問題,https://github.com/angular/angular.js/issues/5899,看來對於type=”email”和 url之類要使用的時候多注意,我的建議是盡量不用。如果需要請寫自訂驗證。下面我會介紹,確實是有夠蛋疼之處。由於這種問題,所以我寫的表單不會出現type=”email” type=”url” type=”number”之類,如果ng解決了這個問題。我再進行更新。

表單的狀態

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表單</title>
</head>
<body>
<form name="form">
    <input type="text" name="name" ng-model="user.name" required ng-minlength="5" ng-maxlength="20"/>
    <input type="text" name="email" ng-model="user.email" required
           ng-pattern="/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/"/>
</form>
 
{{ a }}
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
</script>
</body>
</html>

我們把焦點只聚積到表單(class有如下屬性ng-pristine ng-invalid ng-invalid-required),如果變動在第一個輸入框中輸入s,現在class就變了ng-invalid ng-invalid-required ng-dirty ng-invalid-minlength

 

 

 

 

現在需要解釋一些東西了

AngularJS將DOM驗證的結果儲存在$scope對象中。這使我們能夠即時做出一些處理。提供給我們的屬性有:

$pristine表示使用者是否修改了表單。如果為ture,表示沒有修改過:


formName.$pristine;

$dirty當且使用者是否已經修改過表單:

formName.$dirty

我們來直觀的看下
<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表單</title>
</head>
<body>
<div ng-controller="testController">
    <form name="form">
        <input type="text" name="name" ng-model="user.name" required ng-minlength="5" ng-maxlength="20"/>
        <input type="text" name="email" ng-model="user.email" required
               ng-pattern="/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/"/>
    </form>
    <button ng-click="getFormStatus()">查看錶單狀態</button>
</div>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
    myApp.controller('testController', function($scope){
        $scope.getFormStatus = function(){
            console.log($scope.form);
        }
    })
</script>
</body>
</html>
 

 

 

 

如果表單進行變動的時候,可以看到表單的一些屬性進行了即時的變化。觀察上面四個,你不難發現。$dirty和$valid是相反的,一個true,一個false或者一個false一個true,同樣$valid,是得到現在是否通過驗證的和$invalid也是相反的。

表單的部分說的差不多了,然後說表單中的每項的東西

 

 

 

 

可以看到每個表單項也有跟表單有些共同的屬性,注意一下$error對象,記錄了是哪個出現錯誤正確的。

實戰簡單一實例

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表單</title>
    <style>
        /*在修改的表單項上才顯示錯誤資訊*/
        input.ng-dirty.ng-invalid {
            border: 1px solid red;
        }
    </style>
</head>
<body>
<div ng-controller="testController">
    <form name="form" ng-submit="save()" novalidate="novalidate">
 
        <input type="text" name="name" ng-model="user.name" required ng-minlength="5" ng-maxlength="20"/>
        <span class="error" ng-show="form.$dirty && form.name.$invalid">填寫不正確</span>
        <br />
 
        <input type="text" name="email" ng-model="user.email" required
               ng-pattern="/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/"/>
        <span class="error" ng-show="form.$dirty && form.name.$invalid">填寫格式錯誤</span>
        <br />
        <input type="submit" value="提交"/>
    </form>
 
</div>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
    myApp.controller('testController', function($scope){
        $scope.save = function () {
            //擷取到表單是否驗證通過
            if($scope.form.$valid){
                alert('通過驗證可以提交表單');
            }else{
                alert('表單沒有通過驗證');
            }
        }
    })
</script>
</body>
</html>


顯示效果如圖,當然有人有疑問了,比如第一個表單項,我不想提示填寫不正確這麼模糊的說法,而是告訴他是不是因為他沒有填寫,或者是因為他字元不夠,或者是因為你超過了最大字元。這也非常好辦,還記的$error嗎?可以通過form.name.$error.minlength之類的得到啊。明白了不。還是不明白,好吧,再給逗逼做個代碼執行個體

也許你稍為有些思路了。但還是很多時候力不從心,比如哥想自訂驗證或者通過後台驗證unique呢?再比如他這個一邊輸入一邊就提示效果太他媽差了。我想在提交時提示或者我想在滑鼠不在這個焦點的時候再提示。OK,也許你還有很多想法,但上篇已經結束了,容我整理思路,帶來表單驗證中篇。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.