1

我有一个在 ListView 上设置的 ItemTemplate:

<div class="commentTileTemplate" data-win-control="WinJS.Binding.Template">
    <div class="commentTileControl" data-win-control="WinJS.UI.HtmlControl" data-win-options="{uri: '/htmlControls/commentTile/commentTile.html'}"></div>
</div>

HtmlControl 内部的数据绑定在第一次显示 ListView 时无法绑定,在连续运行时,它工作正常。

如果我从 ListView 中删除模板,那么原始数据会按预期显示,只有在添加 HtmlControl 时它才会首先失败。

知道可能出了什么问题吗?

4

1 回答 1

2

这是因为第一次加载控件时,页面是通过WinJS.xhr包中的 XHR ( ) 异步加载的。这意味着当第一次WinJS.Binding.process()发生在WinJS.Binding.Template.render函数中时,实际内容不会被加载。(例如,它的查询选择器看不到任何data-win-bind属性。

第二次,因为你正在加载的片段已经在片段缓存中,它实际上是同步渲染到 DOM中并且WinJS.Binding.Template.render'sWinJS.Binding.processAll看到了这些data-win-bind属性。

这为您提供了一些选择:

  1. 在您的应用程序启动后立即预加载片段WinJS.UI.Fragments.cache(),并且在该片段完成之前不要在列表视图上设置数据
  2. HtmlControl在您的项目被渲染时实例化,然后在加载时以编程方式实例化HtmlControl, 和WinJS.Binding.process[All]()加载的模板 [1]
  3. 实际上使模板成为您的内容,然后加载片段,处理控件。这比看起来容易,但可能需要一些时间来考虑。简而言之:加载片段,在片段上为您拥有的元素查询选择器data-win-controlWinJS.UI.process()然后将模板实例返回给调用者并将其用作列表视图上的 itemTemplate

[1] HtmlControl 构造函数采用第三个参数,这是在加载片段时调用的回调。

于 2012-09-02T22:48:47.353 回答