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

时间:2015-04-01 12:39:56

标签: javascript angularjs angularjs-directive

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

例如:

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

2 个答案:

答案 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 的定义