使用嵌套for循环WinJS的模板绑定

时间:2012-11-24 20:11:55

标签: winjs

我有一个问题,我正在使用template.render基于html模板呈现项目数组。数组中的每个项目还包含另一个数组,我想在该区域的父元素内绑定到另一个模板。我知道我可以为组使用网格布局,但我正在尝试以另一种方式实现,所以请不要使用不同控件的建议,我只是好奇为什么以下不能正常工作。< / p>

   //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,由于关闭可能会更有意义,但它在第一个上发生的事实真的让我失望了!

有趣的是,如果我使用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的实际.items div

我不太确定这里会发生什么。似乎el的值正在正确更新,但是el.querySelector要么总是返回错误的“.items”div,要么它被保留在某个地方,但是调试确实显示el在循环期间正在改变。任何见解将不胜感激。

感谢

1 个答案:

答案 0 :(得分:1)

我已经弄清楚这里发生了什么。在渲染承诺中返回的“el”不是我想象的新创建的元素。它是渲染器和新创建的html。因此,el.querySelector('。items')总是带回它找到的第一个'.items'。我一定是误读了文档,但希望其他人会发现这些信息对他们有同样的错误很有用。

我想这方面的一个方法是做item_rendered = el.querySelectorAll('。items')[i]并根据循环中的位置返回编号的'.items'

e.g

   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.querySelectorAll('.items')[i];
                    for (var j = 0; j < area.items.length; j++) {
                        var item = area.items[j];
                        var h2 = document.createElement('h2');
                        h2.innerText = item.title;
                        item_renderer.appendChild(h2);
                    }
                });
            }