在自定义指令中查看属性 - AngularJS

时间:2016-04-08 10:56:55

标签: angularjs angularjs-directive

简短背景:我试图编写一个指令来监听我的bootstrap下拉菜单的aria-expanded属性,因为我想在其值变为false时执行某些操作。据我所知,这是" angularJS"如果你想监视元素内部的类更改。

aria-expanded类在这个img元素中。我的指示名称为 overlay-monitor

<img ng-init="displayMainMenu()" overlay-monitor id="nav-burger" uib-dropdown-toggle ng-disabled="disabled" ng-click="sMainMenu=true; isSubMenu=resetMenu(); getLinks(); bStopPropagation=true;" src="img/burger.png">

我真正希望它做的是关闭我在页面上的不透明覆盖,如果aria-expanded变为false。但就目前而言,我只是试图触发警报,看看我是否做得对:

app.directive('overlayMonitor', function () {
return {
    restrict: 'A',
    scope: { ariaExpanded: '@' },
    link: function ($scope, element, attrs) {
        if (element.attrs('aria-expanded') == "true") {
            alert('directive');
        }
    }
}

});

当我测试它时,警报没有显示。 :(

我做错了什么?

请指教。谢谢!

P.S。我忘了提。我们不允许使用jQuery。再次感谢您的回复!

编辑:在阅读了$ watch之后,我尝试了以下代码:

app.directive('overlayMonitor', function () {
return {
    restrict: 'A',
    scope: { ariaExpanded: '@' },
    link: function ($scope, element, attrs) {
        $scope.$watch(function () {
            if (!attrs.ariaExpanded) {
                alert('false');
            }
            else {
                alert('true');
            }
        });
    }
}

});

好消息是警报弹出。坏消息是警报只说&#34; false&#34;。它永远不会发出警报(&#39; true&#39;)。 :/

2 个答案:

答案 0 :(得分:0)

您可以这样使用:

if (attrs.ariaExpanded) { // instead of element.attrs('..')
   alert('directive');
}

答案 1 :(得分:0)

当渲染指令执行时,函数link执行一次。

因此,要跟踪变量中的变化,您需要使用$watch

请尝试以下操作:

app.directive('overlayMonitor', function () {
return {
  restrict: 'A',
  scope: { ariaExpanded: '@' },
  link: function (scope, element, attrs) {
    scope.$watch(function(){ return attrs.ariaExpanded; },
    function(val){
      if (!val) {
         alert('directive');
      }
    });
 }
}
});