【问题标题】:Multiple directives requesting isolate scope to call host scope function in AngularJS多个指令请求隔离范围以调用 AngularJS 中的主机范围函数
【发布时间】:2014-11-12 13:10:36
【问题描述】:

我需要将 2 个回调附加到 <input> 字段,如下所示:

<input ng-model="someModel" 
       first-callback="myOwnCallback()" 
       second-callback="myOtherCallback()">

我试图实现这个创建 2 个指令,它们都需要一个隔离范围并使用 '&' 标志公开这两个属性,如下所示:

[...]
.directive('firstCallback', function() {
    return {
        restrict: 'A',
        scope: { firstCallback: '&' },
        [...]
    }
})
.directive('secondCallback', function() {
    return {
        restrict: 'A',
        scope: { secondCallback: '&' },
        [...]
    }
})
[...]

这显然不起作用,因为 2 个指令都在请求隔离范围,这是不可能的(而且 ngModel 范围也可能存在一些问题,如果有的话)。

这是一个 plnkr:http://plnkr.co/edit/QGc3yrjzt57lWOkd7Etb?p=preview

任何人都可以告诉我在这种情况下是否有好的做法?

【问题讨论】:

  • 解释输入回调的性质?他们应该如何工作? ng-change 不会是“回调”吗?
  • @EliteOctagon 是的,ng-change 是一个回调。第一个应该是 debounced ng-change(延迟后只调用一次),第二个应该是 conditional ng-change(仅在按下某些键时调用) .顺便说一下,在我链接的 plnkr 中,有我想要实现的完整示例。
  • 明白了,现在更清楚了

标签: angularjs angularjs-directive angularjs-scope


【解决方案1】:

是否需要将回调分解为两个不同的指令?像这样的东西有用吗?

http://plnkr.co/edit/CrqyG0H87eF3z2FlojBX?p=preview

.directive('debounceChangeAction', function($timeout) {
    return  {
        restrict: 'A',
        require: 'ngModel',
        scope: {
          debounceChangeAction: '&',
          specialKeyAction: '&'
        },
        link: function(scope,el,attrs,ngModel) {
          console.log('helo')
            var updateTimeout,
                delay = 200;
            var keys = [13,9];
          var update = function(e) {
            if (keys.indexOf(e.keyCode) !== -1) {
                    scope.specialKeyAction();
                    return;
                }

                if(updateTimeout) $timeout.cancel(updateTimeout);
                updateTimeout = $timeout(function() {
                    scope.debounceChangeAction();
                }, delay);
            }
            el.on('keyup', update);
            scope.$destroy(function() {
                el.unbind('keyup');
            });
        }
    };
});

更新示例 http://plnkr.co/edit/v0ztQEcuyYGVpq3Cv17E?p=preview

angular.module('app', [])

.controller('main', function($scope,$timeout) {

  $scope.myDebounceChangeAction = function() {
    console.log('debounceChangeAction', $scope.filter)
  }
  $scope.mySpecialKeyAction = function() {
    console.log('specialKeyAction', $scope.filter)
  }
})

.directive('debounceChangeAction', function($timeout) {
    return  {
        restrict: 'A',
        require: 'ngModel',
        scope: {
          debounceChangeAction: '&',
          specialKeyAction: '&',
          enabler:'@'
        },
        link: function(scope,el,attrs,ngModel) {
          console.log('helo')
            var updateTimeout,
                delay = 200;
            var keys = [13,9];
            var fooA=function(e){
              if (keys.indexOf(e.keyCode) !== -1) {
                    scope.specialKeyAction();
                    return;
                }
            };


            var fooB = function(e){
              if(updateTimeout) $timeout.cancel(updateTimeout);
                updateTimeout = $timeout(function() {
                    scope.debounceChangeAction();
                }, delay);
            };

          var update = function(e) {

            switch(scope.enabler){
              case 'A':
                fooA(e);
                break;
              case 'B':
                fooB(e);
                break;
              case 'AB':
                fooA(e);
                fooB(e);
                break;
            }

            }
            el.on('keyup', update);
            scope.$destroy(function() {
                el.unbind('keyup');
            });
        }
    };
});

【讨论】:

  • 实际上我需要在 2 个指令中打破功能,因为在某些情况下我需要一个,而在其他情况下我需要另一个。无论如何,我需要弄清楚如何实现这一点,因为我猜这可能是一个很常见的场景。
  • 实际上我可以只写一个公开这两个属性的单个属性,但我想知道如何保持这两个属性不同..
  • 如何创建模块并根据指令需要导入它们?
  • 我不明白你的意思。你的意思是角度模块?请给我一个例子好吗?
  • 不要介意模块的想法。如果为单个指令定义一个附加参数,该参数将用于驱动一个 case 语句,以了解按键上发生的情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多