其他分享
首页 > 其他分享> > AngularJS观察指令属性表达式,动态继承作用域

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

作者:互联网

我的代码很简单:

.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,因为它会观察插值属性. (documentation).在这种情况下,可以在如下范围内使用$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

标签:angularjs,angularjs-directive,angularjs-scope,expression,javascript
来源: https://codeday.me/bug/20191028/1953699.html