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

实现指令以从验证中排除隐藏的输入元素($ addControl问题)

东方建修
2023-03-14
问题内容

我正在创建一条指令以从验证中排除隐藏的输入元素:http
:
//plnkr.co/edit/Vnwvq2AT7JpgTnoQwGh9?p=preview

app.directive('shownValidation', function() {
    return {
      require: '^form',
      restrict: 'A',
      link: function(scope, element, attrs,form) {
        var control;

        scope.$watch(attrs.ngShow,function(value){
          if (!control){
            control = form[element.attr("name")];
          }
          if (value == true){
            form.$addControl(control);
          }else{
             form.$removeControl(control);
          }
        });
      }
    };
  });

这里的想法是,如果该元素是隐藏的,我将从窗体中删除该控件,以便它不会影响其他输入的有效性。当我打电话时form.$removeControl(control);,它工作正常
,您可以通过删除名字并单击按钮以隐藏字段来在演示中进行测试。

但是,当我再次单击该按钮时,即使名字无效(空),形式有效性仍然为真

我还尝试添加form.$setValidity(form.$valid && control.$valid)=>有效性状态已按预期更新,但是当我输入名字时,有效性仍然为false。

我的问题是如何解决这个问题?感谢您的任何答复。

更新

感谢@Michael的回答。这是有效的解决方案:

app.directive('shownValidation', function() {
  return {
    require: '^form',
    restrict: 'A',
    link: function(scope, element, attrs, form) {
      var control;

      scope.$watch(attrs.ngShow, function(value) {
        if (!control) {
          control = form[element.attr("name")];
        }
        if (value == true) {
          form.$addControl(control);
     //Add a forEach to manually update form validity.Thanks to @Michael's answer
          angular.forEach(control.$error, function(validity, validationToken) {
            form.$setValidity(validationToken, !validity, control);
          });
        } else {
          form.$removeControl(control);
        }
      });
    }
  };
});

工作勤奋


问题答案:

如果移除控件,则角度更新有效性(来自源):

  form.$removeControl = function(control) {
    if (control.$name && form[control.$name] === control) {
      delete form[control.$name];
    }
    forEach(errors, function(queue, validationToken) {
      form.$setValidity(validationToken, true, control);
    });

    arrayRemove(controls, control);
  };

如果添加控制角度未更新有效性(来自来源):

  form.$addControl = function(control) {
    // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
    // and not added to the scope.  Now we throw an error.
    assertNotHasOwnProperty(control.$name, 'input');
    controls.push(control);

    if (control.$name) {
      form[control.$name] = control;
    }
  };

因此我们必须手动执行此操作。我猜是这样的:

if (value == true){
    form.$addControl(control); 
    angular.forEach(control.$error, function(validity, validationToken) {
       form.$setValidity(validationToken, !validity, control);
    });
   }else{
    form.$removeControl(control);
   }
}


 类似资料:
  • 当调用函数时,将显示输入。这个函数(绑定到ng-dblclick指令)只是将true设置为,并尝试调用jQuery对输入元素的方法(以前存储在链接器函数的作用域中,作用域为: 简而言之,我想在双击某物时可视化以前隐藏的输入,并立即对其进行聚焦。需要即时焦点,因为当输入失去焦点时会隐藏(我希望用户能够立即编辑输入内容。当用户点击离开时,输入会隐藏)。 问题是,我似乎不能以编程方式将焦点放在input

  • 问题内容: 我知道命令行界面(例如Git等)能够隐藏用户的输入(对于密码有用)。有没有办法用Java编程地做到这一点?我正在从用户那里输入密码,我希望他们的输入在该特定行(而不是所有用户)上被“隐藏”。这是我的代码(尽管我怀疑这会有所帮助…) 问题答案: 尝试。不过,您至少必须运行Java 6。 请注意,这不适用于Eclipse控制台。您必须从 真实的 console / shell / term

  • 问题内容: 我有一个输入,其类型设置为隐藏,我需要将其类型更改为文本。似乎无法弄清楚这一点,或者jQuery是否可行 问题答案: 使用jQuery 1.4,您可以在分离输入时更改其类型。

  • 隐藏所有指定的元素。 使用展开运算符(...)和 Array.forEach() 将 display: none 应用于每个指定的元素。 const hide = (...el) => [...el].forEach(e => (e.style.display = 'none')); hide(...document.querySelectorAll('img')); // Hides all

  • 本文向大家介绍jquery显示隐藏元素的实现代码,包括了jquery显示隐藏元素的实现代码的使用技巧和注意事项,需要的朋友参考一下 或  它是个集合肯定没有display属性 $("#firstStep").hide(500);而且可以设置时间;("#firstStep").hide(500);而且可以设置时间; $(".class").css('display','block'); $("#id

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