【发布时间】:2014-09-19 07:39:09
【问题描述】:
我正在尝试编写一个隔离指令,该指令将运行正则表达式来验证某些输入字段。 我希望指令知道根据输入的属性匹配和使用什么正则表达式。
示例输入如下所示。
<input required tabindex="5" regex-validation regex="validationRegex.zipRegex" ng-model="payment.zip" type="text" />
下面是指令中的一个示例,它设置了一个控制器来匹配指令本身。 scope.regex.test 日志未定义。
module.controller('Controller', function($scope) {
$scope.validationRegex = {
americanExpressRegex: new RegExp(/^(?!3[47]).*$/),
cvvRegex: new RegExp(/^[0-9]{3,4}$/),
currencyRegex: new RegExp(/^[$]?\d{0,18}\.?\d{0,2}$/),
cityRegex: new RegExp(/^[a-zA-Z]+(?:[\s-][a-zA-Z]+)*$/),
zipRegex: new RegExp(/^[0-9]{5}(?:-[0-9]{4})?$/),
phoneRegex: new RegExp(/^(\d(\s|\.|\-)?)?\(?\d{3}\)?(\s|\.|\-)?\d{3}(\s|\.|\-)?\d{4}$/),
/* jshint ignore:start */
emailRegex: new RegExp("^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$"),
/* jshint ignore:end */
numberRegex: new RegExp(/^\d+$/),
addressRegex: new RegExp(/^[A-Za-z0-9 \-_\.,]{0,55}$/),
bankAccountRegex: new RegExp(/^[0-9]{1,17}$/),
routingNumberRegex: new RegExp(/^((0[0-9])|(1[0-2])|(2[1-9])|(3[0-2])|(6[1-9])|(7[0-2])|80)([0-9]{7})$/)
};
})
.directive('regexValidation', [function () {
return {
scope: { regex: "=" },
link: function (scope, element) {
element.bind('change', function () {
console.log(scope.regex);
//grab the element we are working with into a jquery element
var ele = $(element);
//grab the element value for multiple future use
var value = ele.val();
//if we have a value check with regex
if (value && !**scope.regex.test**(value)) {
ele.parent().addClass("error");
}
//this will set the element back to how it was and check to see if all validation is
//complete
else {
ele.parent().removeClass("error");
}
});
}
};
}]);
【问题讨论】:
-
您觉得我的回答有帮助吗?关于这个主题,您还有什么需要了解的吗?
-
有助于处理事物的思维方式。但更多的是寻找为什么这个指令范围属性正则表达式不能匹配它在视图中被告知的正确正则表达式......我最终通过将validationRegex对象从控制器拉到指令中并匹配validationRegex来解决这个问题属性名称基于提供的元素的正则表达式属性......
-
正如我的回答所解释的那样,你会遇到各种各样的问题,因为你以各种可能的方式在 Angular 之外工作。 (绑定更改侦听器,直接从元素中提取值,直接修改类)。那时,Angular 实际上是在与你争夺对事物的控制权,而且肯定不会回应你想要的东西。这就是为什么通常建议停止使用 jQuery 和 Angular 的原因。它提供很少/没有帮助,并鼓励与 Angular 对抗。这现在有意义吗?
标签: javascript angularjs angularjs-directive