1

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

我想做的,或者更好的我所拥有的:“协议”的集合,它们有一些相似之处,例如:名称、创建者、上次编辑、评论等,但它们都有特殊的字段。

我有一个与所有这些协议相匹配的指令。显示名称和所有协议共有的所有内容。在这个指令中,我想检查给定协议的特殊(更具体)视图是否可用。就我而言,我称之为“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,角度内的某处是存在指令的信息,我很想找到它。

关于如何解决这种“通用指令”方法的任何想法或建议?也许我对这个嵌套指令的概念是错误的,并且有一个更简单的方法?

两个代码块都在directive() 的链接函数中

4

0 回答 0