如何在AngularJS中生成即时指令?
我希望能够获取字符串数组,然后基于这些字符串创建指令。元素或属性都可以正常工作,但似乎无法使其正常工作如何在AngularJS中生成即时指令?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我希望能够获取字符串数组,然后基于这些字符串创建指令。元素或属性都可以正常工作,但似乎无法使其正常工作 <div ng-repeat="module in modules.directives"> <div {{module.directive}}></div> </div> <div ng-repeat="module in modules.directives"> <{{module.directive}}&
<div ng-repeat="module in modules.directives">
<div {{module.directive}}></div>
</div>
<div ng-repeat="module in modules.directives">
<{{module.directive}}></{{module.directive}}>
</div>
<div ng-repeat="module in modules.directives">
<{{module.directive}} />
</div>
这些都不能用。有什么想法吗?
ng include
可以帮助您。方法是为每个指令定义一个模板。像这样的
<script type="text/ng-template" class="template" id="test-module">
<test-module></test-module>
</script>
然后在ng重复做
<div ng-repeat="module in modules.directives">
<ng-include src="module.directive">
</div
您可以定义一个指令来代理另一个这样的指令
<div proxy="'ng-if'" proxy-value="'foo'"></div>
<div ng-init="n='ng-if'; v='foo';" proxy="n" proxy-value="v"></div>
这实际上是一个有趣的指令,一生只写一次。:-)但它缺少许多本机指令特性(例如模板、templateUrl、控制器等)。所有这些功能都可以在原始Angle源代码中的一个名为applyDirectivesToNode
的私有函数中获得,因此复制/粘贴某些部分很容易,但是。。。我已经编写了一个与您的用例相匹配的演示
如果您不介意代理指令与代理
指令不共享相同的元素,另一个解决方案是在运行时$compile
一个动态模板,您将包括该模板。这是一个。为什么需要这样做?您的指令在代码中是固定的和预定义的吗?是的,预定义的。如果我手动输入
,它会工作。甚至
也能工作。但是class=“{module.directive}}”
不起作用。@ovmjm模块由动态源代码控制,所以我不能硬编码任何东西。但是每个模块都必须在脚本标记中硬编码吗?指令的名称应该事先知道,并且应该使用模板注册,并且匹配的脚本id
似乎不起作用。我可能应该提到,这是在另一个指令中。尝试了
,但没有任何ng重复,但没有骰子。此脚本应在html中定义。您应该能够通过执行$(“#测试模块”)
来获取此对象。它应该是DOM的一部分。返回是什么意思?有什么需要调查的吗?您的需求只涉及纯模板指令?因为我可以想出一种方法来代理指令功能,如模板或templateUrl,这很有趣,我已经有了模板代理,但它越来越难看了。也许如果你解释一下你真正想要达到的目标,我们可能会找到一个更直接的解决你问题的方法。这可能适用于您的用例。但是,让我明白,你真的需要指令吗?或者任何其他小部件系统都能满足您的根本需求?因为也许你真正想要的只是一对partial/controller。下面是一个partial/controller小部件的演示。如果您以具有复杂UI的独立小部件为目标,这是很好的。如果您针对更小的可重用和可组合的小部件组件,则指令会更好。我想。
<div ng-if="foo"></div>
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);
};
});