【问题标题】:Directive (nested inside a partial) throws “Termplate must have exactly one root element”指令(嵌套在部分中)抛出“模板必须只有一个根元素”
【发布时间】:2015-10-19 17:09:17
【问题描述】:

我正在尝试遵循 Angular 最佳实践建议并使用指令来 封装可重用的 HTML 元素。 错误信息:

错误:模板必须只有一个根元素。是:partials/user/path/to/somedata.html

指令代码:

.directive('stDirectivename', function() {
    return {
        restrict: 'E',
        replace: true,
        // transclude: false,
        template: 'partials/user/path/to/somedata.html'
    };
})

还有模板:

<div ng-show="person.condition" class="someclass">
    <span class = "personRoi">
        <i class="anotherclass " ng-class="{'specialclass1': person.count>=0,'specialclass2':person.count<0}">

        </i>{{person.somedata}}%
    </span>
</div>

在部分(它是模态的模板)中调用为:
&lt;st-directivename&gt;&lt;/st-directivename&gt;

当我将模板 url 替换为指令中的简单 html 字符串时。一切正常。不幸的是,对于涉及' 的真实模板,我不能这样做。除了这个解决方案不会扩展到更大的模板我计划一些指令。

此外,当我只插入模板 html 而不是指令标记时,一切正常(我实际上是从现有 html 中提取代码以使其可重用)。

我在其他 SO 问题中读到,这与模板中有额外的空间/标签/cmets 有关。但我就是找不到这样的元素。

有人知道解决方案吗?我很乐意为您提供任何帮助。

【问题讨论】:

  • 1) 模板文件不能有前导或尾随空白字符(包括换行符)。 2)您粘贴的模板缺少结束 &lt;/div&gt;(并包含前导空格)...
  • @J.Bruni 抱歉,这只是一个 SO 单,现在已修复以显示模板,div 已关闭且没有前导空格
  • Trailing 在模板中也会产生这个错误,我发现了。
  • @J.Bruni 说得对!我只是浪费了大量时间尝试各种解决方案,而我所要做的就是从指令 html 中删除一些 html cmets ....uggg!

标签: angularjs angularjs-directive


【解决方案1】:

您的错误是:您必须使用templateUrl 而不是template 以指示html部分的路径

.directive('stDirectivename', function(){
    return {
        restrict:'E',
        replace:true,
        //transclude:false,
        templateUrl:'partials/user/path/to/somedata.html'

    };
})

【讨论】:

    【解决方案2】:

    对于可能出现的那些,还请注意,指令模板需要——正如错误所说——只有一个根元素,即多个跨度或 div 必须包含在根 div 中。

    还要注意 OP 上的 cmets:模板中的空格或尾随 cmets 也可能导致此错误。

    似乎在下一个版本/更新中可能会包含一个让 Angular 不那么喜怒无常的修复:github.com/angular/angular.js/issues/1459

    【讨论】:

    • 我的模板确实是从一个html评论开始的,它在删除评论后导入了模板。
    • 非常有帮助!我的模板已注释 html,它也会导致此错误。在我删除评论的 html 后一切正常。
    【解决方案3】:

    对于那些仍在寻找更多线索的人......当我在指令的 templateUrl 路径中输入错误时遇到了同样的错误。如果您有 replaced: true,则会收到此错误。否则,您可能会看到更疯狂的错误 WARNING: Tried to load angular more than once,这让我花了很长时间才弄清楚,因为错误消息确实具有误导性。

    【讨论】:

    • 但是如果我想使用replace:true 是否有其他方法可以修复错误?
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2016-09-07
    • 2017-08-09
    • 2017-02-02
    • 2017-03-03
    相关资源
    最近更新 更多