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

监视AngularJS指令中元素的类更改

乐正浩博
2023-03-14
问题内容

将一个类添加到元素时,我想向该元素添加另一个类。当一个类被删除时,我想删除一个元素。我基本上是将一些引导程序类映射到某些角度形式验证类,但是当从元素中添加/删除一个类时,我无法弄清楚如何触发我的代码(还要确保不要引起类更改的无限循环)

到目前为止,这是我的指令的内容:

.directive('mirrorValidationStates', ['$log', function($log) {
  function link(scope,element,attrs) {
    scope.$watch(element.hasClass('someClass'), function(val) {
      var classMap = {
        'popupOn': 'has-error',
        'ng-valid': 'has-success'
      };

      for (var key in classMap) {
        if (element.hasClass(key)) {
          $log.info("setting class " + classMap[key]);
          element.parent().addClass(classMap[key]);
        } else {
          $log.info("removing class " + classMap[key]);
          element.parent().removeClass(classMap[key]);
        }
      }
    });
  }
  return {
    link: link
  };
}]);

因此,基本上,当popupOn添加到元素时,我想将has-errorbootstrap类添加到父元素。何时popupOn删除,我想删除has- error

我想在Angular中实现这一目标而错过了什么?也许有ng-class的东西而不使用指令?

非常感谢!


问题答案:

作品在这里

您可能想尝试此构造以遵循类更改:

$scope.$watch(function() {return element.attr('class'); }, function(newValue){});

请注意,观看的添加/删除类见解将导致添加类的另外一个调用,而不会更改类属性值。

但是我认为更好的方法是使用ng-class。例如,在您想添加一个’popupOn’类的时刻,您要设置一些范围值($ scope.popup =
true),然后为父元素和子元素指定ng-class,如下所示:

<div ng-class={'has-error': (popup==true)}>
    <div id="patient" ng-class={'popupOn': (popup==true)}>test</div>
    <button ng-click="addClass()">addClass</button>
    <button ng-click="removeClass()">removeClass</button>
</div>

当您想删除这些类时,只需将$ scope.popup值设置为false

用ng级提琴



 类似资料:
  • 问题内容: 我尝试创建一个指令,当输入字段标记为无效时,该指令应执行一些操作。对于此示例,假设我有一条指令检查输入是否为素数,并且我想创建一条指令,在无效时将一个类添加到元素: validate-prime使用ng-model上的解析器和格式化程序来更新模型的有效性。 现在,我希望invalid-add-class指令在模型无效时添加“错误”类,并在有效时将其删除。换句话说,它应该监视模型控制器的

  • 问题内容: 我有这样的设置: 控制器广播事件 指令侦听,然后通过append将其写入DOM,并以此创建指定指令的新元素。 IE浏览器: Angular从未调用过指令 当我检查DOM(并调试)时,我看到Controller 和指令正在执行其工作,并且有新的元素。 什么不见​​了?动态创建这些元素后需要做什么来触发指令调用? 问题答案: 请参阅。您可以类似于以下方式使用此服务: 这将执行新元素的编译和

  • 问题内容: 我有一个指令,可以在一个页面上多次使用。在此指令的模板中,我需要对输入元素使用ID,以便可以将Label“绑定”到它,如下所示: 现在的问题是,一旦多次包含我的指令,ID“ item1”就不再是唯一的,并且标签将无法正常工作(单击时应选中/取消选中该复选框)。 该问题如何解决?有没有一种方法可以为模板分配“名称空间”或“前缀”(例如asp.net使用ctl00 …- Prefix)?还

  • 问题内容: 我正在为Angular开发基于UI和排版的指令。在这种情况下,该指令所应用的元素是未知的-从div,span,h1到h5的任何值。 使用模板的原因是我可以向其中添加指令(因此开发人员无需记住指令名称即可)。 我添加属性和重新编译元素的成功有限。但是,添加时没有成功。创建新元素并替换旧元素会带来集成问题(忽略元素上可能存在的其他指令和数据属性),复制这些属性并将其添加到新元素的效果很小。

  • 我们还可以通过在侦听器中添加目标来响应外部事件,例如从 或 document。 对于一个指令,这个概念是相当简单的。 将您的指令属性放在哪个模板标记被认为是Host元素。如果我们像上面这样实现HighlightDirective: 在组件的上下文中,Host元素是您通过组件配置中的选择器字符串创建的标记。 对于上面示例中的,组件类的上下文中的Host元素将是<my-text-box>标记。

  • 问题内容: 我正在尝试在指令中的元素上使用。我发现的所有示例似乎都在控制器上进行了设置… 我在表单验证上派了一个JS小提琴,并尝试了很多方法。任何见解将不胜感激:http : //jsfiddle.net/thomporter/pmKpG/2/ 在小提琴中,在控制器上调用: 我想做类似的事情: 这样我就可以执行以下操作: 问题答案: 我想通了…您必须在输入元素上有一个名称。添加名称后,错误会根据需