使用代码中的模板实例化WinJS.UI.ListView时出错

时间:2015-03-07 02:50:36

标签: javascript windows-8 windows-8.1 winjs

在创建包含WinJS.UI.ListView的自定义WinJS控件的过程中,我试图允许用户传递模板的选择器。

然而,无论我是否有模板"预先创建"在HTML页面中,就像你期望的那样:

<div data-win-control="WinJS.Binding.Template"> <!-- ... --> </div>

如果我查询元素并从以下代码创建模板,那也不是:

var template = new WinJS.Binding.Template(document.querySelector(selector));

当我实例化ListView并将模板元素本身(或其winControl属性)传递给ListView的itemTemplate选项时,如下:

new WinJS.UI.ListView(elem,  { itemTemplate: template.winControl });

我收到以下错误:

  

将在ms-appx://microsoft.winjs.2.0/js/base.js的第115行第115行的JavaScript库代码中捕获异常

     

0x800a01b6 - JavaScript运行时错误:对象不支持属性或方法&#39; _renderItemImpl&#39;

我试图稍微追溯一下,但在base.js迷路了。希望其他人遇到这种情况。

注意:我已将我的解决方法作为答案。

2 个答案:

答案 0 :(得分:3)

我能够开始工作的唯一解决方法是在代码中实例化模板,然后在实例化ListView时将函数传递给itemTemplate选项。关于预期内容的文档是稀疏的,但是ListView通过代码实例化的所有演示都使用模板函数,因此我认为这是实现这一目标的唯一方法。

new WinJS.UI.ListView(elem,  {
    itemTemplate: function (promise) {
        return promise.then(function (item) {
            return resultsTemplate.render(item.data);
        });
    }
});

答案 1 :(得分:0)

在尝试使用Binding.Template之前,请确保已处理WinJS.UI.processAll()的声明性标记。您可以使用ListView处理声明性标记。

如果您以声明方式同时创建Binding.TemplateBinding.Template,请确保标记中首先显示ListView,以便在{{1}时完成处理尝试消耗它。

Check out this sample创建带有声明性标记的ListView和模板。