javascript - 有没有办法通过指令来做到这一点?

标签 javascript angularjs angularjs-directive

我可以毫无问题地运行指令属性中引用的 $scope 函数。问题是我需要捕获指令中触及的元素并将其传递给属性中的函数。我还没弄清楚该怎么做。隔离指令中的范围将引发错误,因为有 2 个指令试图对同一元素执行操作。

使用下面的代码,我得到的 $eventundefined ,当然还有一个错误。有什么办法可以实现我想要的吗?或者也许有更好的方法?

<li class="list-group-item row" data-touchstart="darkenBackground($event)" data-touchend="lightenBackground($event)">

..

angular.module('myNotes')
    .directive('touchstart', [function () {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
                elem.bind('touchstart', function(e) {
                    e.preventDefault();
                    scope.$apply(attrs.touchstart);
                });
            }
        };
    }]);

angular.module('myNotes')
    .controller('notesCtrl', ['$scope', 'Site',
        function($scope, Site) {
            Site.setTitle('My Notes');
            Site.setActiveNavLink('myNotes');

            $scope.darkenBackground = function($event) {
                angular.element($event.currentTarget)
                    .css('background-color', '#eee');
            };
            $scope.lightenBackground = function($event) {
                angular.element($event.currentTarget)
                    .css('background-color', '#fff');
            }
    }]);

最佳答案

问题是这样的:

scope.$apply(attrs.touchstart);

当您直接在 Angular 表达式上调用 scope.$apply 时(这就是 attrs.touchstart),它会自动根据 scope 计算该表达式,因此 scope.$event (未定义)被传递给回调。

要将事件传递给回调,您可以使用 scope.$eval 的第二个参数(称为“locals”)临时包含 $event 属性计算表达式时的范围。

return {
  restrict: 'A',
  link: function (scope, elem, attrs) {
    elem.bind('touchstart', function (e) {
      e.preventDefault();
      scope.$apply(function () {
        scope.$eval(attrs.touchstart, {$event: e});
      });
    });
  }
};

关于javascript - 有没有办法通过指令来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937069/

相关文章:

javascript - jQuery 无法选择子项

javascript - Angular Material 日期选择器尺寸错误

javascript - 带有 typeof 表达式的 ng-switch

javascript - 如何确保$http请求在循环内按顺序执行

javascript - 首次调用 setInterval 的时间安排与其他调用不同

在 Zend Studio 中生成 Javascript 和突出显示的 PHP 脚本

javascript - 缓存javascript文件的基础是什么?

javascript - Internet Explorer 中的 HTMLDivElement 对象上未定义“append”

twitter-bootstrap - 带有 Bootstrap 3 的 Angular Dialog 指令

javascript - angularjs 验证输入并在无效时防止更改