Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法通过指令来实现这一点?_Javascript_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript 有没有办法通过指令来实现这一点?

Javascript 有没有办法通过指令来实现这一点?,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我可以让指令属性中引用的$scope函数运行。问题是我需要捕获指令中涉及的元素,并将其传递给属性中的函数。我还不知道怎么做。隔离指令中的作用域将引发错误,因为有2条指令试图对同一元素执行操作 使用下面的代码,我得到的$event是未定义的,当然是一个错误。有没有办法达到我想要的?或者有更好的办法 <li class="list-group-item row" data-touchstart="darkenBackground($event)" data-touchend="lightenB

我可以让指令属性中引用的
$scope
函数运行。问题是我需要捕获指令中涉及的元素,并将其传递给属性中的函数。我还不知道怎么做。隔离指令中的作用域将引发错误,因为有2条指令试图对同一元素执行操作

使用下面的代码,我得到的
$event
未定义的
,当然是一个错误。有没有办法达到我想要的?或者有更好的办法

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

我是这样工作的,但我不确定这是否是最好/正确的方法:

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

我是这样工作的,但我不确定这是否是最好/正确的方法:

<li class="list-group-item row" data-touchstart="darkenBackground(event)">
问题是:

scope.$apply(attrs.touchstart);
当您直接对角度表达式调用
scope.$apply
(这就是
attrs.touchstart
的含义)时,它将根据
scope
自动计算该表达式,因此
scope.$event
(未定义)将传递给回调

要将事件传递给回调,可以使用
作用域的第二个参数($eval
)在计算表达式时在作用域上临时包含
$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});
      });
    });
  }
};
问题是:

scope.$apply(attrs.touchstart);
当您直接对角度表达式调用
scope.$apply
(这就是
attrs.touchstart
的含义)时,它将根据
scope
自动计算该表达式,因此
scope.$event
(未定义)将传递给回调

要将事件传递给回调,可以使用
作用域的第二个参数($eval
)在计算表达式时在作用域上临时包含
$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});
      });
    });
  }
};

假设隔离作用域满足您的需要,这也是可行的,但是您应该使用
scope.$apply
包装对
scope.touchstart
的调用,并且无论何时在angular之外执行与角度相关的操作,例如在DOM事件回调内部执行此操作。@mzulch是的!我本打算这么做的,但在整个故障排除阶段之后忘记添加它。我更新了我的答案。假设隔离作用域满足您的需要,这也可以,但是您应该使用
scope.$apply>来包装对
scope.touchstart
的调用,并且在angular之外执行与角度相关的操作时(例如在DOM事件回调内部)也可以执行同样的操作。@mzulch是的!我本打算这么做的,但在整个故障排除阶段之后忘记添加它。我更新了我的答案。我更喜欢这个答案,因为我不需要隔离范围。这样,我也可以对touchstart和touchend使用单独的指令。我更喜欢这个答案,因为我不需要隔离范围。这样,我也可以对touchstart和touchend使用单独的指令。