假设我有一个角度应用程序,它有一些模块和一些指令 我想获得此应用程序中所有已定义指令的列表。
例如:
var myModule = angular.module('myModule', [function(){...}]);
myModule.directive('myDirective', [function () {...}]);
myModule.directive('myOtherDirective', [function () {...}]);
var myOtherModule = angular.module('myOtherModule', [function(){...}]);
myOtherModule.directive('thirdDirective', [function () {...}]);
我想写一个函数getAllDirectives()
,它将返回['myDirective','myOtherDirective','thirdDirective']
。
如果可能的话,我也想知道每个指令属于哪个模块:
{
'myModule': ['myDirective','myOtherDirective'],
'myOtherModule':['thirdDirective']
}
如何做到这一点?
请注意,我需要在应用程序本身之外以及已经加载之后执行此操作。我可以访问页面上公开提供的任何内容,例如angular
对象和DOM
。
答案 0 :(得分:4)
您可以使用类似这样的自定义函数获取每个模块中定义的所有指令:
function get_directives(name) {
var result = [],
invokes = angular.module(name)._invokeQueue;
for(var i=0; i<invokes.length; ++i) {
if(invokes[i][1] == "directive") {
result.push(invokes[i][2][0]);
}
}
return result;
}
var result = {
'myModule': get_directives('myModule'),
'myOtherModule': get_directives('myOtherModule'),
};
您还可以检查angular.module('module_name')._invokeQueue
列表以获取未来知识。
答案 1 :(得分:0)
<强>解决方案强> 以下函数将返回模块
下的所有指令function getAllDirectives(moduleName) {
var directives = [];
var invokes = angular.module(moduleName)._invokeQueue;
for (var i in invokes) {
if (invokes[i][1] === "directive") directives.push(invokes[i][2]);
}
return directives;
}
getAllDirectives('school') //'school' is module name
附加
如果您想要模块的 指令定义 ,请
var getDirectiveDef = function(dirName, appName){
dirName = converToCamelCase(dirName);//converting dirname to camelCase if it has hyphen
var allDirs = getAllDirectives(appName) //the above mentioned functoin
_.each(allDirs, function(directive){
if(directive[0] == dirName){
console.log(directive);
}
})
}
function getAllDirectives(moduleName) {
var directives = [];
var invokes = angular.module(moduleName)._invokeQueue;
for (var i in invokes) {
if (invokes[i][1] === "directive") directives.push(invokes[i][2]);
}
return directives;
}
//used to convert incase if the directive name is not in camelCase input
function converToCamelCase (string) {
return string.replace( /-([a-z])/ig, function( all, letter ) {
return letter.toUpperCase();
});
}
示例
getDirectiveDef('play-ground', 'school')
[or]
getDirectiveDef('playGround', 'school')
将在学校 direcitve
下打印指令 playGround 的定义