Dynamic 动态创建ng模式的指令
我正在尝试为Dynamic 动态创建ng模式的指令,dynamic,angularjs,directive,Dynamic,Angularjs,Directive,我正在尝试为input元素创建一个指令,该指令将动态创建ng模式,以检查输入字段中的有效IP地址。我所有这样做的尝试都完全失败了。虽然我可以动态修改其他属性,但我无法创建将影响$valid状态的ng模式 下面是我一直在研究的代码,它似乎应该可以工作,但它对ng模式没有任何作用 app.directive('ipAddress', function($parse) { return { link: function(scope, element, attrs) {
input
元素创建一个指令,该指令将动态创建ng模式
,以检查输入字段中的有效IP地址。我所有这样做的尝试都完全失败了。虽然我可以动态修改其他属性,但我无法创建将影响$valid
状态的ng模式
下面是我一直在研究的代码,它似乎应该可以工作,但它对ng模式没有任何作用
app.directive('ipAddress', function($parse) {
return {
link: function(scope, element, attrs) {
var model = $parse(attrs.ngPattern);
model.assign(scope, "/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/");
scope.$apply();
};
});
指令:
<input ng-model="ip" ip-address required type="text" id="inputIP" placeholder="xxx.xxx.xxx.xxx">
是的,我知道我可以在
标记中指定ng模式
,但关键是我希望能够在代码中动态地执行此操作,并且我希望通过不在那里嵌入一堆regex代码来保持
标记的整洁
有人能帮我吗?谢谢 您可以在控制器中定义模式,然后在html中使用:
$scope.pat=/^.*$/
然后是html
<input ng-pattern="pat" ... >
虽然您希望答案不使用ng模式,但我建议您不要使用该指令,因为使用它与在代码中包含另一个文件相比不会增加太多好处
相反,我建议您使用常量使您的模式在全球范围内可用,以便其他表单也可以使用它,就像指令一样,但不需要额外的开销
您可以声明一个常数,如:
app.constant('FORMATS'{
“ipAdressRegex”:/^此处为您的正则表达式)*$/i
});代码>
并在控制器或服务中使用此常量:
var Controller = app.controller('Controller', ['$scope','FORMATS',
function ($scope,FORMATS) {
$scope.ipAddressPattern = FORMATS.ipAdressRegex;
.
.
.
在你看来:
<input class="form-control" type="text"
id="input_ip" name="email" data-ng-model="user.ip_add"
data-ng-pattern="ipAddressRegex" />
您可以在config.js中执行
_.assign($rootScope, _.pick(FORMATS, 'ipAddressRegex'));
视图将保持与以前一样这真的很好(谢谢!),但我希望找到一种在指令中设置ngPattern变量的方法,这样HTML元素甚至不需要定义“ng pattern”属性。看这里:这里的诀窍是在尝试将数据移动到模型时调用“ctrl.$parsers.push”。您可以通过不返回值来防止这种情况。在本例中,您还可以设置输入的有效性。基于这个例子,我有一个只允许输入数字的构建输入。您也可以对IP执行同样的操作。实际上@user254349建议的解决方案不起作用。请看一看,如果我将ng pattern=“mypattern”替换为ng pattern=“/^\d*$/”,它将按预期工作,只接受数字。有什么想法吗?不要在代码中引用模式。完全尝试(不带“):$scope.mypattern=/^\d*$/;
_.assign($rootScope, _.pick(FORMATS, 'ipAddressRegex'));