您可以定义一个指令来代理另一个指令,就像这样
<div proxy="'ng-if'" proxy-value="'foo'"></div>
<div ng-init="n='ng-if'; v='foo';" proxy="n" proxy-value="v"></div>
这都相当于
<div ng-if="foo"></div>
proxy
指令定义将是
app.directive('proxy', function ($parse, $injector) {
return function (scope, element, attrs) {
var nameGetter = $parse(attrs.proxy);
var name = nameGetter(scope);
var value = undefined;
if (attrs.proxyValue) {
var valueGetter = $parse(attrs.proxyValue);
value = valueGetter(scope);
}
var directive = $injector.get(name + 'Directive')[0];
if (value !== undefined) {
attrs[name] = value;
}
return directive.compile(element, attrs, null)(scope, element, attrs);
};
});
这实际上是一种有趣的指令,一生只写一次。:-) 但它缺少很多本机指令功能(例如template、templateUrl、controller等)。所有这些功能都可以在原始 Angular 源代码中的一个名为 的私有函数中使用,因此很容易复制/粘贴某些部分,但是很难看……我已经编写了一个与您的用例匹配的applyDirectivesToNode
演示。
如果您不介意代理指令与proxy
指令的元素不共享相同的元素,另一种解决方案是$compile
在运行时包含一个动态模板。这是一个演示。