如何获取给定 angular 应用程序中的所有指令名称?

How to get all directive names in a given angular app?

假设我有一个 angular 应用程序,它有一些模块和一些指令。
我想获取此应用程序中所有已定义指令的列表。

例如:

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(),它将 return ['myDirective','myOtherDirective','thirdDirective']

另外如果可能我也想知道每个指令属于哪个模块:

{
    'myModule': ['myDirective','myOtherDirective'],
    'myOtherModule':['thirdDirective']
}

如何做到这一点?
请注意,我需要从应用程序本身外部并在它已经加载后执行此操作。我确实有权访问页面上公开提供的任何内容,例如 angular 对象和 DOM.

您可以使用像这样的自定义函数获取每个模块中定义的所有指令:

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 列表以获取未来知识。

解决方案 下面的函数将 return 模块下的所有指令

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')

将在 school direcitve

下打印指令 playGround 的定义