如果您愿意通过 1.1.x 代码路径上的构建生活在最前沿(请注意每个 1.1.x 构建说明条目附带的警告,因此我不会通过在此处再次重复来稀释此答案),您'很幸运——这个功能刚刚在 4 月 3 日的 1.1.4 版本中添加。您可以在此处找到 1.1.4 的发行说明,该功能的任务日志包含一个演示如何使用新功能的 Jasmine 测试。
如果您比较保守并且使用的是 1.0.x 版本,那么您将无法轻松完成此操作,但可以完成。Mark Rajcok 的解决方案看起来符合您的要求,但我只想添加一些额外的注释:
- 除了 1.1.4 版本之外,编译时指令不支持在运行时进行修改。
- 您可能需要考虑
replaceWith()
不是append()
因为<my-directive>
不是标准定义的 HTML 元素类型。
- 如果您的 X 和 Y 模板包含额外的指令,我认为您将无法
<my-template>
如此轻松地将属性传递给模板的根元素。
- 带有 replace: true 的指令会将属性从源元素传输到其替换根,但我认为
ngInclude
从主机到包含模板的根不会这样做。
- 我似乎还记得
ngInclude
不需要它的模板只有一个根元素。
- 您也许可以通过使用
replaceWith()
而不是将标签append()
包装在. 外部可以保存属性,并且在元素用加载的内容替换自身后仍然可以访问。<div ng-include="">
<div></div>
<div>
<div ngInclude>
- 请注意,这
ngInclude
会创建一个新范围。这会使您受到关于原始示波器模型危险的闪烁黄色喇叭的警告。有关更多信息,请参阅Angular 的 GitHub 仓库中的这个精美页面。
我可以为 1.0.x 上的用户提出另一种替代方案,但它涉及大量代码。这是一个更重量级的操作,但它的好处是不仅可以在模板之间切换,还可以在完全成熟的指令之间切换。此外,它的行为更容易动态化。
app.directive('myDirective', function() {
return {
restrict: 'E',
replace: true,
templateUrl: 'partials/directive/my-directive.html',
link: function(scope, element, attrs, ctrl) {
// You can do this with isolated scope as well of course.
scope.type = attrs.type;
}
}
);
我的directive.js
<div ng-switch on="{{type}}">
<div ng-switch-where="X" ng-include="X-template.html"></div>
<div ng-switch-where="Y" ng-include="Y-template.html"></div>
</div>
我的指令.html