AngularJS观察指令属性表达式,动态继承作用域

AngularJS observe directive attribute expressions, inherit scope dynamically

本文关键字:动态 继承 作用域 表达式 观察 指令 属性 AngularJS      更新时间:2023-09-26

我的代码很简单:

.controller('Ctrl', ['$scope', '$timeout', function ($scope, $timeout) {
    $timeout(function () {
      $scope.x = 5;
    }, 2000);
  }])
.directive('ngHey', ['$parse', function ($parse) {
    return {
      'restrict': 'A',
      'scope': true,
      'link': function($scope, el, atr) {
        var go = function () {
            if ($parse(atr.ngHey)()) {
              alert('oiiiiiii');
            }
          };
        atr.$observe('ngHey', function (val) {
          if (val) {
            go();
          }
        });
      }
    };
  }]);

//view.html

<div ng-controller="Ctrl">
<span ng-hey="x > 3"></span>
</div>

我希望能够在指令表达式更改时以及当它是真是假时触发,但目前警报从未发生。。。

只有当我做一些类似的事情时,它才有效:

<div ng-controller="Ctrl">
    <span ng-hey="{{x > 3}}"></span>
    </div>

这不是我想要的,我希望指令执行ng if或ng hide等的表达式…

感谢任何提示或帮助,感谢

在这种情况下不能使用$observe,因为它是Observes an interpolated attribute.(文档)。在这种情况下,您可以在如下范围内使用$watch

.directive('ngHey', ['$parse',
    function($parse) {
        return {
            scope: true,
            link: function($scope, el, atr) {
                var go = function(value) {
                    if (value) {
                        alert('oiiiiiii');
                    }
                };
                $scope.$watch(atr.ngHey, function(val) {
                    if (val) {
                        go(val);
                    }
                });
            }
        };
    }
]);

演示:http://plnkr.co/edit/XakjA2I7lpJdo9YAZFEH?p=preview

UPD根据OP的评论,更新后的指令看起来像:

.directive('ngHey', ['$parse',
    function($parse) {
        return {
            scope:{ngHey: '='},
            link: function($scope, el, atr) {
                var go = function(value) {
                    if ($scope.ngHey) {
                        alert('oiiiiiii');
                    }
                };
                $scope.$watch('ngHey', function(val) {
                    if (val) {
                        go();
                    }
                });
            }
        };
    }
]);

注意,在这种情况下如何使用$scope.ngHey,不需要$eval属性。

演示:http://plnkr.co/edit/XakjA2I7lpJdo9YAZFEH?p=preview

JSFIDDLE演示

由于$timeout稍后将设置x的值,因此检查属性的指令中的条件始终返回false。因此,每当x发生变化时,使用$watch检查go()中的条件。

var myApp = angular.module('myApp',[]);
myApp.directive('ngHey', function () {
    return {
      'restrict': 'A',
       'scope': true,
      'link': function($scope, el, attr) {
        var go = function () {
            if ($scope.$eval(attr.ngHey)) {
              alert('oiiiiiii');
            }
          };
        $scope.$watch('x', function (val) {
          if (val) {
            go();
          }
        });
      }
    };
  });

代替$parse使用$scope.$eval,并且同样地代替$observe使用$watch