检查是否存在具有给定名称的指令,angularjs

时间:2016-02-18 00:51:42

标签: javascript angularjs angularjs-directive angularjs-injector

有没有办法检查角度指令是否存在?

我想做什么,或者我拥有的更好: 一系列'协议',它们有一些相似之处,例如:名称,创建者,最后编辑者,评论等,但它们都有特殊字段。

我有一个与所有协议匹配的指令。显示所有协议共有的名称和所有内容。 在这个指令中,我想检查给定协议的特殊(更具体)视图是否可用。在我的情况下,我称之为" CompactView"。 CompactView将提供此协议的更多详细信息,它应显示在实际指令中。所以嵌套指令 - 没什么大不了的。

我的第一个approched工作正常,我有一个数组,其协议名称为键,指令html元素(字符串)为值:

        let decider = {
            'cardiovascular_function': '<hcd-Cardiovascular-Function-Compact-View protocol="protocol"/>'
        };
        //use suitable directive
        let protocolDirective = decider[scope.protocol.name];
        let templateHook = angular.element(element).find('.extend-protocol-info')[0];
        //use base template
        //hooks protocol directive into template if possible
        if (typeof protocolDirective != 'undefined') {
            let compiled = $compile(angular.element(protocolDirective))(scope);
            angular.element(templateHook).html(compiled);
            scope.defaultTxt = false;
        }else{
            scope.defaultTxt = true;
        }

如果在决策器数组中没有键退出,我将显示一些默认的txt解释,没有可用的CompactView。

应用程序可能会增长,并且会遵循许多协议,因此当有人创建协议时,需要扩展决策程序数组。容易失败,如果我能检查一个名称是否存在并编译它会更好。

我接近的新方式如下:

        let protocolName = scope.protocol.name;
        let directiveName = 'hcd' + _.capitalize(_.camelCase(protocolName)) + 'CompactView';
        //example: <hcd-Cardiovascular-Function-Compact-View protocol="protocol"/>

        console.log(directiveName);
        console.log($injector.has(directiveName));
        try {
            console.log(angular.module('hcdProtocol').directive(directiveName));
        } catch (err) {
            console.log(err);
        }
        //check if directive for given protocol exists
        if ($injector.has(directiveName)) {

            scope.defaultTxt = false;
            let templateHook = angular.element(element).find('.extend-protocol-info')[0];
            let protocolDirective = '<hcd-' + _.kebabCase(protocolName) + '-Compact-View protocol="protocol" />';
            let compiled = $compile(angular.element(protocolDirective))(scope);
            angular.element(templateHook).html(compiled);
        } else {
            //display default if no compact view exists
            scope.defaultTxt = true;
        }

所以$ injector.has不起作用,因为指令没有在$ provide中注册。重新定义和检查错误,try catch块也不起作用。

我目前正在尝试理解$ compileProvider,在angular中的某个位置是指令存在的信息,我很乐意找到它。

关于如何解决此问题的任何想法或建议&#34;通用指令&#34;进场? 也许我对这个嵌套指令的概念是错误的,并且有一个更简单的方法吗?

两个代码块都在directive()

的链接函数内

0 个答案:

没有答案