Javascript 如何从一个指令调用另一个指令的函数

Javascript 如何从一个指令调用另一个指令的函数,javascript,angularjs,Javascript,Angularjs,我有以下指令abc module.directive("abc", [ "notifier", "session", function(notifier, session) { return { restrict: "E", replace: true, scope: { buffer: "=" }, template: "<li class=\"file \" ng-class=\"{active:

我有以下指令
abc

module.directive("abc", [
  "notifier", "session", function(notifier, session) {
    return {
      restrict: "E",
      replace: true,
      scope: {
        buffer: "="
      },
      template: "<li class=\"file \" ng-class=\"{active: active, dirty: dirty, changed: changed}\">\n  " + 
"   <ul class=\"participants\">\n    " + 
"       <li ng-class=\"participant.style\" ng-repeat=\"(id, participant) in buffer.participants\" title=\"{{participant.handle}}\">\n    </li>\n  " + 
"   </ul>\n  " + 
"   <a class=\"filename\" ng-click=\"activateBuffer(buffer)\" ng-dblclick=\"promptFileRename(buffer) | trackEvent:'File':'Rename':'Sidebar'\">{{buffer.filename}}</a>\n  " + 
"   <ul class=\"file-ops\">\n    " + 
"       <li class=\"delete\">\n      " + 
"           <button ng-click=\"promptFileDelete(buffer) | trackEvent:'File':'Delete':'Sidebar'\" class=\"btn btn-mini\" tooltip=\"Delete this file\" tooltip-placement=\"right\">\n        " + 
"               <i class=\"icon-remove\"></i>\n      " + 
"           </button>\n    " + 
"       </li>\n  " + 
"   </ul>\n" + 
"</li>",

controller: function($scope){
        var buffer;
        buffer = $scope.buffer;

        $scope.$watch((function() {
          return session.isDirty(["buffers", buffer.id]);
        }), function(dirty) {
          $scope.dirty = dirty && Date.now();
          return $scope.changed = dirty && !$scope.active;
        });
        $scope.$watch((function() {
          return session.getActiveBuffer() === buffer;
        }), function(active) {
          $scope.active = active && Date.now();
          return $scope.changed = false;
        });
        $scope.activateBuffer = function(buffer) {
          return session.activateBuffer(buffer.filename);
        };
        $scope.promptFileRename = function(buffer) {
            console.log("rename file function called");
       /*   return notifier.prompt("Rename file", buffer.filename, {*/
        //confirm: function(filename) {
          //return session.renameBuffer(buffer.filename, filename);
        //}
      /*});*/
        };
        $scope.promptFileDelete = function(buffer) {
            console.log("delete file function called");
       /*   return notifier.confirm("Confirm Delete", "Are you sure that you would like to delete " + buffer.filename + "?", {*/
        //confirm: function() {
          //return session.removeBuffer(buffer.filename);
        //}
      /*});*/
        };

      //
      //link: function($scope, $el, attrs) {
//}

}

    };
  }
]);

但是我得到了错误
editor-0.11.9.js:5931错误:没有控制器:abc
您不能随意使用“require”来获取控制器的实例

module.directive("abc", [
  "notifier", "session", function(notifier, session) {
    return {
      restrict: "E",
      replace: true,
      scope: {
        buffer: "="
      },
      template: "<li class=\"file \" ng-class=\"{active: active, dirty: dirty, changed: changed}\">\n  " + 
"   <ul class=\"participants\">\n    " + 
"       <li ng-class=\"participant.style\" ng-repeat=\"(id, participant) in buffer.participants\" title=\"{{participant.handle}}\">\n    </li>\n  " + 
"   </ul>\n  " + 
"   <a class=\"filename\" ng-click=\"activateBuffer(buffer)\" ng-dblclick=\"promptFileRename(buffer) | trackEvent:'File':'Rename':'Sidebar'\">{{buffer.filename}}</a>\n  " + 
"   <ul class=\"file-ops\">\n    " + 
"       <li class=\"delete\">\n      " + 
"           <button ng-click=\"promptFileDelete(buffer) | trackEvent:'File':'Delete':'Sidebar'\" class=\"btn btn-mini\" tooltip=\"Delete this file\" tooltip-placement=\"right\">\n        " + 
"               <i class=\"icon-remove\"></i>\n      " + 
"           </button>\n    " + 
"       </li>\n  " + 
"   </ul>\n" + 
"</li>",

controller: function($scope){
        var buffer;
        buffer = $scope.buffer;

        $scope.$watch((function() {
          return session.isDirty(["buffers", buffer.id]);
        }), function(dirty) {
          $scope.dirty = dirty && Date.now();
          return $scope.changed = dirty && !$scope.active;
        });
        $scope.$watch((function() {
          return session.getActiveBuffer() === buffer;
        }), function(active) {
          $scope.active = active && Date.now();
          return $scope.changed = false;
        });
        $scope.activateBuffer = function(buffer) {
          return session.activateBuffer(buffer.filename);
        };
        $scope.promptFileRename = function(buffer) {
            console.log("rename file function called");
       /*   return notifier.prompt("Rename file", buffer.filename, {*/
        //confirm: function(filename) {
          //return session.renameBuffer(buffer.filename, filename);
        //}
      /*});*/
        };
        $scope.promptFileDelete = function(buffer) {
            console.log("delete file function called");
       /*   return notifier.confirm("Confirm Delete", "Are you sure that you would like to delete " + buffer.filename + "?", {*/
        //confirm: function() {
          //return session.removeBuffer(buffer.filename);
        //}
      /*});*/
        };

      //
      //link: function($scope, $el, attrs) {
//}

}

    };
  }
]);
如果在指定级别上找到控制器/指令,则需要工作

因此,例如,如果您的指令都位于同一父级(例如,它们在同一控制器的模板中定义),那么您可以使用require with
^
^
前缀来指定angular相对于当前指令位置可以找到所需控制器的位置

从文件:

^^前缀表示此指令在其父级上搜索控制器。(前缀“^”将使指令在其自己的元素或其父元素上查找控制器;如果没有任何前缀,则指令将仅在其自己的元素上查找。)

因此,例如,如果您的指令位于具有以下模板的控制器中:

<div>
  <abc></abc>
  <def></def>
</div>

说你有指令

        angular.module('app', [])
        .directive("Directve1", function() {
          return {
            restrict: "E",
            controller: function($scope) {

              this.sayHello = function() {
                //some logic...
              };
              ....
        });
另一个需要Directve1方法的指令

            .directive("Directve2", function() {
              return {
                require: "Directve1",  //include require
                link: function (scope, element, attrs, directive1Ctrl) {
                  directive1Ctrl.sayHello();
                }
              };
             })

注:directive1Ctrl是require(require:“Directve1”)中提到的指令的控制者

只有在同一个元素上应用这两种方法时,才能使用上面的
require
调用。您可以发布一个示例吗?
这里只有您可以使用require。如果一个是另一个的父级,也可以使用
^
。您还可以使用
事件广播
。每当我使用链接时,require似乎都失败了输入返回对象。知道为什么会发生这种情况吗?每当我在return对象中使用link键时,require似乎失败了。你知道为什么会发生这种情况吗?如果def在abc中,你能告诉我如何要求def进入abc吗?
            .directive("Directve2", function() {
              return {
                require: "Directve1",  //include require
                link: function (scope, element, attrs, directive1Ctrl) {
                  directive1Ctrl.sayHello();
                }
              };
             })