Почему он не
Право, документация renderAsFragment
немного сбивает с толку; он гласит:
Отображает шаблон сои в единый узел или фрагмент документа. Если оказанные HTML строка представляет собой отдельный узел, то этот узел будет возвращен
Однако (упрощенный) осуществление renderAsFragment
является:
var output = template(opt_templateData); var html = goog.soy.ensureTemplateOutputHtml_(output); goog.soy.assertFirstTagValid_(html); // This is your failure var safeHtml = output.toSafeHtml(); return dom.safeHtmlToNode(safeHtml);
Так почему же закрывающим автор утверждает, что первый тег не <tr>
?
Это потому, что внутренне, safeHtmlToNode
места safeHtml
во временном div
, прежде чем решить, должен ли он вернуть div
wrappper (общий случай) или единственного ребенка (если оказанная HTML представляет собой только один узел). Еще раз упрощена, код safeHtmlToNode
является:
var tempDiv = goog.dom.createElement_(doc, goog.dom.TagName.DIV); goog.dom.safe.setInnerHtml(tempDiv, html); if (tempDiv.childNodes.length == 1) { return tempDiv.removeChild(tempDiv.firstChild); } else { var fragment = doc.createDocumentFragment(); while (tempDiv.firstChild) { fragment.appendChild(tempDiv.firstChild); } return fragment; }
renderAsElement не будет работать либо
И я уверен, что вы просите фрагментов, но, к сожалению goog.soy.renderAsElement()
будет вести себя так же потому, что он также использует временный div
для рендеринга DOM.
renderElement не может быть зациклена
Сообщение об ошибке предлагает goog.soy.renderElement
, но это будет работать только если таблица имеет одну строку, так как он заменяет содержание, и не добавляет дочерние узлы.
Рекомендуемый подход
Так обычно, мы делаем цикл в шаблоне:
{template .myTable} <table> {foreach $person in $data.persons} <tr><td>Hello {$person.name}</td></tr> {/foreach} </table> {/template}
Конечно, мы можем сохранить простой шаблон у вас есть для одной строки и call
его из более крупный шаблон.
Использовать $ Лицо вместо человека в рекомендуемом подходе. –