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'));