有没有办法检查角度指令是否存在?
我想做什么,或者我拥有的更好: 一系列'协议',它们有一些相似之处,例如:名称,创建者,最后编辑者,评论等,但它们都有特殊字段。
我有一个与所有协议匹配的指令。显示所有协议共有的名称和所有内容。 在这个指令中,我想检查给定协议的特殊(更具体)视图是否可用。在我的情况下,我称之为" 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()
的链接函数内