2014-01-26 52 views
0

如何根據另一個範圍變量的存在有條件地使用angular的電子郵件驗證?我查看了文檔,但是我發現觸發電子郵件驗證的唯一方法是使用input type="email",在這種情況下,由於type="text"上的其他指令的依賴性,我無法使用它。有條件的電子郵件驗證

理想情況下,我要麼根據另一個範圍變量的值來指定ng-match =「email」,要麼只是在提交時以編程方式驗證電子郵件。理論上,我可以只使用一個單獨的電子郵件驗證正則表達式,但如果可能的話,我想使用Angular的驗證,因爲我在其他地方使用該驗證。

感謝

- 編輯:爲了澄清,我特別想用角的原生電子郵件驗證在任何解決方案,我最終使用。

+0

只寫一個自定義的指令爲 – Mik378

+0

是的,我知道我能做到這一點,但我該如何使用角度的原生電子郵件驗證該指令,如果我走這條路? – jraede

+0

您可以爲您的指令設置比電子郵件更高的**優先級**(假設您在指令的鏈接功能中處理您的過程)。因此,電子郵件驗證將在您的自定義指令的過程之前發生。 – Mik378

回答

2

您應該在電子郵件輸入欄中使用ng-requiredng-pattern

<input type="text" ng-model="email" ng-required="emailRequired" ng-pattern="emailPattern" /> 

然後定義emailPattern作爲控制器的$scope功能。

$scope.emailPattern = (function() { 
var regexp = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 
return { 
    test: function(value) { 
     if($scope.emailRequired === false) return true; 
     else return regexp.test(value); 
    } 
}; 

})();

下面撥弄實現你想要什麼:

http://jsfiddle.net/9SSE4/

+0

正確,但沒有辦法使用角度的正則表達式,而不明確複製它? – jraede

+0

不,因爲angular的正則表達式電子郵件驗證僅適用於type =「email」的輸入。 – tomepejo

+0

您可以直接嘗試使用angular的文檔示例。這裏:http://jsfiddle.net/5uW2U/ – tomepejo

0

你能更改輸入的類型?如果輸入應該被驗證爲電子郵件,然後將其類型設置爲電子郵件,否則將其設置爲文本。

<input type="{{vm.type}}" ng-model="vm.text" /> 
<select ng-model="vm.type"> 
    <option>text</option> 
    <option>email</option> 

Example Plunker