Javascript 在指令中向$element添加函数

Javascript 在指令中向$element添加函数,javascript,jquery,angularjs,directive,Javascript,Jquery,Angularjs,Directive,我有一页有两条指令。我需要从一个指令调用另一个指令中的函数。我已将该函数添加到第一个指令的$element对象中,并使用jQuery从另一个指令调用它。这是正确的方法还是应该使用两个指令共享的上下文对象 //inside directive 1 link fn $element[0].foo = function(){ console.log("test"); } ... //inside directive 2 link fn $('.className').foo() 这两个指令是具有共

我有一页有两条指令。我需要从一个指令调用另一个指令中的函数。我已将该函数添加到第一个指令的$element对象中,并使用jQuery从另一个指令调用它。这是正确的方法还是应该使用两个指令共享的上下文对象

//inside directive 1 link fn
$element[0].foo = function(){
console.log("test");
}

...
//inside directive 2 link fn
$('.className').foo()

这两个指令是具有共享控制器的页面上的元素。每个都有一个独立的作用域。这似乎很有效。有什么理由不应该这样做吗?

这两条指令是否共享同一个控制器?如果是这样,您可以从一个指令调用控制器上的函数,该指令将“通知”另一个指令。或者,您可以使用事件,检查此答案

这不是您应该使用的方式。尽量避免使用$element,它会执行DOM操作,这些操作速度慢,角度也会自行处理。要在directiveB中调用由directiveA触发的函数,最好创建一个服务

angular.service('Communication', function () {
  var _listeners = [];

  return {
    addListener: function (callback) {
      _listeners.push(callback);
    },
    removeListener: function () {/* Clean up */},
    invokeListeners: function (data) {
      _listeners.forEach(function (listener) {
        listener(data);
      });
    }
  }
});

angular.directive('directiveB', ['Communication', function (Communication) {
  return {
    restrict: 'AE',
    scope: {},
    controller: directiveB
  };

  function directiveB (scope, element, attrs) {
    Communication.addEventListener(function (data) { /* Do stuff with data */  });
  }
}]);

angular.directive('directiveA', ['Communication', function (Communication) {
  return {
    restrict: 'AE',
    scope: {},
    controller: directiveA
  };

  function directiveA (scope, element, attrs) {
    // trigger event in directive B
    Communication.invokeListeners('test');
  }
}]);

您可能应该将其发布到@jehna1,因为问题中发布的代码显然不是编译/工作的,因为它是存根代码。看到没有完整的代码,我假设“这是正确的方法”指的是这里没有显示的代码实际工作。如果代码被破坏,那么ofc stackoverflow就是解决方法。请提供所有相关的代码结构。如果一条指令是另一条指令的子指令,则可以
要求子指令中的父控制器如果您没有使用隔离作用域,则可以让其中一条指令将函数(例如$foo)注入作用域,并让另一条指令使用一个属性来使用该作用域方法(例如do foo=“$foo()”).这不是答案,应该删除…使用评论栏要求澄清这为什么不是答案?我建议他用事件来交流,然后这只是一个“仅链接”的答案,而那些是不赞成的。如果您不准备提供示例,请使用注释块