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();
}
};
})