Angular ng-repeat-start在ng-repeat-end的不同“级别”标记内。这是一个错误吗?

时间:2015-02-26 12:41:56

标签: angularjs angularjs-ng-repeat

我遇到了这种情况,我需要使用ng-repeat-start / ng-repeat-end重复HTML代码块,但有点抱怨:

  

错误:[$ compile:uterdir]未终止的属性,找到' ng-repeat-start'但没有匹配的' ng-repeat-end'找到。

我找到了一种解决方法,它可能对遇到这种情况的人有用。我也想知道你的想法。这是一个错误吗?我应该避免这种做法?我使用的是Angular v1.3.5,代码就是这样:



<table>
  <thead>
    ...
    <tr ng-repeat-start="a in b">
      ...
    </tr>
    ...
  </thead>
  <tbody>
    ...
  </tbody>
  <thead>
    ...
    <tr ng-repeat-end>
      ...
    </tr>
    ...
  </thead>
</table>
&#13;
&#13;
&#13;

问题似乎是ng-repeat-end不在同一个HTML标记块中(这里是thead所在的第一个ng-repeat-start

我找到了一个使用以下代码的解决方法:

&#13;
&#13;
<table>
  <thead>
    ...
  </thead>
  <thead ng-repeat-start="a in b">
    <tr>
      ...
    </tr>
    ...
  </thead>
  <tbody>
    ...
  </tbody>
  <thead>
    ...
  </thead>
  <thead ng-repeat-end>
    <tr>
      ...
    </tr>
    ...
  </thead>
</table>
&#13;
&#13;
&#13;

这样我就会将ng-repeat-startng-repeat-end带到同一个标记table

1 个答案:

答案 0 :(得分:1)

ngRepeat是一个multiElement指令。

如果查看$compile source,可以看到angularJs将遍历下一个兄弟节点:

/**
 * Given a node with an directive-start it collects all of the siblings until it finds
 * directive-end.
 * @param node
 * @param attrStart
 * @param attrEnd
 * @returns {*}
 */
function groupScan(node, attrStart, attrEnd) {
  var nodes = [];
  var depth = 0;
  if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {
    do {
      if (!node) {
        throw $compileMinErr('uterdir',
                  "Unterminated attribute, found '{0}' but no matching '{1}' found.",
                  attrStart, attrEnd);
      }
      if (node.nodeType == NODE_TYPE_ELEMENT) {
        if (node.hasAttribute(attrStart)) depth++;
        if (node.hasAttribute(attrEnd)) depth--;
      }
      nodes.push(node);
      node = node.nextSibling;
    } while (depth > 0);
  } else {
    nodes.push(node);
  }

  return jqLite(nodes);
}

在个人帐户中,尝试将此与非兄弟元素一起使用会让人感觉非常不自然。