当前位置: 首页 > 面试题库 >

AngularJS自定义表单验证指令在我的模式中不起作用

越涛
2023-03-14
问题内容

我决定编写一个自定义指令来帮助我验证输入框。这个想法是,我将新的fancy nx-validate指令添加到引导程序div.form- group,它将检查my <input/>is $dirty或is $invalid并根据需要应用.has-successor
.has-error类。

出于某种奇怪的原因,我的指令在正常情况下可以正常工作,但是在ng-classui-bootstrap模态内部完全忽略了添加的指令。

模态和形式相同的代码

<form name="mainForm">
  <div class="row">
      <div nx-validate class="form-group has-feedback col-lg-6 col-md-6 col-xs-12">
          <label class="control-label">Green if long enough, red if not</label>
          <input type="text" id="name" class="form-control" ng-model="property.name" required="required" ng-minlength="5"/>
          (once touched I do change colour - happy face)
      </div>
  </div>

我可爱的指令

nitro.directive("nxValidate", function($compile) {
    return {
        restrict: 'A',
        priority: 2000,
        compile: function(element) {

            var node = element;
            while (node && node[0].tagName != 'FORM') {
                console.log (node[0].tagName)
                node = node.parent();
            }
            if (!node) console.error("No form node as parent");
            var formName = node.attr("name");
            if (!formName) console.error("Form needs a name attribute");


            var label = element.find("label");
            var input = element.find("input");
            var inputId = input.attr("id")

            if (!label.attr("for")) {
                label.attr("for", inputId);
            }

            if (!input.attr("name")) {
                input.attr("name", inputId);
            }

            if (!input.attr("placeholder")) {
                input.attr("placeholder", label.html());
            }

            element.attr("ng-class", "{'has-error' : " + formName + "." + inputId + ".$invalid && " + formName + "." + inputId + ".$touched, 'has-success' : " + formName + "." + inputId + ".$valid && " + formName + "." + inputId + ".$touched}");
            element.removeAttr("nx-validate");

            var fn = $compile(element);

            return function($scope) {
                fn($scope);
            }

        }
    }
});

在插件上查看:http
://plnkr.co/edit/AjvNi5e6hmXcTgpXgTlH 吗?


问题答案:

我建议您使用的最简单方法是,可以通过在这些字段上使用watch来放置这些类,这watcherpostlink在编译DOM之后位于函数内

return function($scope, element) {
    fn($scope);

    $scope.$watch(function(){
      return $scope.modalForm.name.$invalid && $scope.modalForm.name.$touched;
    }, function(newVal){
      if(newVal)
        element.addClass('has-error');
      else
        element.removeClass('has-error');
    })

    $scope.$watch(function(){
      return $scope.modalForm.name.$valid && $scope.modalForm.name.$touched;
    }, function(newVal){
      if(newVal)
        element.addClass('has-success');
      else
        element.removeClass('has-success');
    })
}

在这里演示

更新资料

实际的更好方法是代替编译元素,我们需要函数本身$compile的元素link。在链接fn中使用DOM进行编译的原因$compile是,我们的ng- class属性确实包含范围变量,例如myForm.name.$invalid,因此,当我们$compile使用DOM编译功能时,myForm.name.$invalid由于编译无法访问范围,因此它们不评估变量的值。永远是undefinedblank。因此,尽管在内编译DOM时link将具有所有包含的作用域值,myForm.name.$invalid所以在使用指令作用域进行编译后,您将获得ng- class指令绑定有效的功能。

compile: function(element) {
    //..other code will be as is..

    element.removeAttr("nx-validate");
      //var fn = $compile(element); //remove this line from compile fn
      return function($scope, element) {
         //fn($scope);
         $compile(element)($scope); //added in postLink to compile dom to get binding working
      }
 }

更新的Plunkr



 类似资料:
  • 问题内容: 此自定义验证指令是官方角度网站上提供的示例。 http://docs.angularjs.org/guide/forms会 检查文本输入是否为数字格式。 为了对该代码进行单元测试,我编写了以下代码: 然后我得到这个错误: 我到处都放置了print语句以查看发生了什么,而且该指令似乎从未被调用过。测试像这样的简单指令的正确方法是什么? 问题答案: 另一个答案的测试应写为: 请注意,now

  • 我在Angular中有一个自定义验证的表单构建器,但我在自定义验证中读取文件后无法获取文件的类型。 下面是StackBlitz: https://stackblitz.com/edit/Angular-ivy-atwqqc?file=src%2fapp%2fapp.component.ts TS文件

  • 问题内容: 我有一个看起来像这样的表格: 它的设置使得输入数据后所有必填字段和“保存”按钮都可以使用。但是,部分验证是,我将使用输入的数据使用$ http通过POST通过服务器访问服务器。 我应该在函数中放置该逻辑还是有一个更好的放置位置? 更新: * 我实现了以下内容,将其作为元素上的属性应用,但它在每次我不喜欢的按键上调用服务器/数据库: 问题答案: 您不需要在指令中发出$ http请求,更好

  • 问题内容: 我有一个用于自定义验证的指令(验证用户名尚不存在)。验证使用$ http服务来询问服务器用户名是否存在,因此返回的是Promise对象。这对于验证非常有用。表单无效,并且包含myform。$ error.usernameVerify,当用户名已被使用时。但是,user.username始终是未定义的,因此它破坏了我的ng- model指令。我认为这可能是因为.success中的函数正在

  • 问题内容: 我发现很多以下形式的html输入模式,这是电话号码: 我想创建一个自定义指令,无论该指令适用于哪里,它都会告诉Angular应用所有这三个规则,例如: 然后,我指令中的代码将找到并调用一个名为的函数,在该函数中我将看到类似以下内容的内容: 清单1: 我宁愿使用上述方法而不是为这些规则重写代码,例如: 清单2: 我不想取消所有基于属性的指令,但最好创建一个“宏”指令,该指令将调用我的清单

  • 问题内容: 我在AngularJS应用程序中创建了一个指令,该指令在我的应用程序中生成样式输入。看起来像这样: 它的模板是: 调用很简单: 我想为此字段创建验证,并添加了错误信息: 而showError是: 基本上,它是从《用AngularJS掌握Web应用程序开发》一书中复制的。我有一个问题,因为当我在控制台中登录表单时,我的名字是,而不是name属性,这里的值应该是“ name”。我究竟做错了