我遇到了一个问题,我正在使用 template.render 来呈现基于 html 模板的项目数组。数组中的每个项目还包含另一个数组,我想在该区域的父元素内绑定到另一个模板。我知道我可以为组使用网格布局,但我正在尝试以另一种方式完成此操作,所以请不要建议使用不同的控件,我只是好奇为什么以下内容无法正常工作。
//html templates
<div id="area-template" data-win-control="WinJS.Binding.Template">
<h1 class="area-title" data-win-bind="innerHTML:title"></h1>
<div class="items">
</div>
</div>
<div id="item-template" data-win-control="WinJS.Binding.Template">
<h2 class="item-title" data-win-bind="innerHTML:title"></h2>
</div>
// JS in ready event
var renderer = document.getElementsByTagName('section')[0];
var area_template = document.getElementById('area-template').winControl;
var item_template = document.getElementById('item-template').winControl;
for (var i = 0; i < areas.length; i++) {
var area = areas.getAt(i);
area_template.render(area, renderer).done(function (el) {
var item_renderer = el.querySelector('.items');
for (var j = 0; j < area.items.length; j++) {
var item = area.items[j];
item_template.render(item, item_renderer).done(function (item_el) {
});
}
});
}
那么应该发生的是,在它渲染区域之后,在“完成”函数中,新创建的元素(el)被返回,然后我发现它是“.items”div来附加项目。但是,这会将所有项目附加到创建的第一个 div 中。如果它是最后一个 div,由于闭包,它可能更有意义,但它发生在第一个 div 上的事实真的让我失望!
有趣的是,如果我使用 document.createElement 和 el.appendChild 替换我的模板渲染函数,它会正确显示,例如:(在完成区域渲染中)
area_template.render(area, renderer).done(function (el) {
var item = area.items[j];
var h2 = document.createElement('h2');
h2.innerText = item.title;
el.appendChild(h2);
}
虽然我已经意识到这是 el 它正在附加它,而不是 el 的实际 .items div
我不太确定这里会发生什么。看起来 el 的值正在正确更新,但是 el.querySelector 要么总是返回错误的“.items” div,要么它被保留在某个地方,但是调试确实表明 el 在循环期间发生了变化。任何见解将不胜感激。
谢谢