首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinJS:嵌套ListViews

WinJS:嵌套ListViews
EN

Stack Overflow用户
提问于 2012-11-04 12:13:02
回答 2查看 1.5K关注 0票数 1

我对Windows8Metro应用程序中的嵌套ListViews有问题。我得到了错误:

代码语言:javascript
复制
Exception was thrown at line 5840, column 33 in 
ms-appx://microsoft.winjs.1.0/js/base.js 0x800a138f - JavaScript runtime error: 
Unable to get property 'dataSource' of undefined or null reference

守则是:

代码语言:javascript
复制
<div id="color" data-win-control="WinJS.Binding.Template">
    <div>color</div>
</div>
<div id="row" data-win-control="WinJS.Binding.Template">
    <div>
        <div>row</div>
        <div 
            data-win-control="WinJS.UI.ListView"
            data-win-options="{ itemDataSource : colorsDataSource.dataSource, 
                    itemTemplate: select('#color')}">  
        </div>
    </div>
</div>
<div id="basicListView" 
    data-win-control="WinJS.UI.ListView"
    data-win-options="{ itemDataSource : Data.rowsDataSource.dataSource, 
            itemTemplate: select('#row')}">  
</div>

有问题的一行是:

代码语言:javascript
复制
data-win-options="{ itemDataSource : colorsDataSource.dataSource, 
                    itemTemplate: select('#color')}"

问题是,在评估数据--双赢选项时,colorsDataSource在某种程度上是不可访问的--不确定原因,因为数据结构数据在用户界面被解析之前是静态的和初始化的(在args.setPromise(WinJS.UI.processAll();)之前)。

例如,当我尝试修改模板时:

代码语言:javascript
复制
<div id="row" data-win-control="WinJS.Binding.Template">
    <div>
        <div>row</div>
        <div data-win-bind="innerText: colorsDataSource.dataSource" ></div>
    </div>
</div>

它正确地输出对象对象..。

javascript结构数据如下所示:

代码语言:javascript
复制
var rows = new WinJS.Binding.List([]);
model.rows.forEach(function (row) {
    rows.push({
       colorsDataSource : new WinJS.Binding.List(row.rowData.colors)
    });                
});
Data.rowsDataSource = rows;

data-win-options编辑: Hm,我找到了原因(在base.js中处理属性):

代码语言:javascript
复制
var options;
var optionsAttribute = element.getAttribute("data-win-options");
if (optionsAttribute) {
    options = WinJS.UI.optionsParser(optionsAttribute, global, {
        select: createSelect(element)
    });
}

这些选项是在全局上下文中计算的,这意味着无法获得当前处理的项(在我的例子中是项).

解决方法是创建自定义呈现程序(整个自定义控件)。这里部分描述了http://stephenwalther.com/archive/2012/05/23/metro-dynamically-switching-templates-with-a-winjs-listview.aspx --参见itemTemplateFunction

EN

回答 2

Stack Overflow用户

发布于 2012-11-04 18:46:34

嵌套的列表视图基本上不工作,也不受支持。不幸的是,你找不到一个简单的答案。

票数 0
EN

Stack Overflow用户

发布于 2012-11-04 22:35:12

正如Chris所述,嵌套ListViews不受支持。

但是,这不能工作的更大原因是,您需要一些方法来获取下一个控件上的数据本身(让我们忽略它是一个列表视图)。

您已经尝试使用data-win-options属性来解决这个问题,正如您正确指出的那样,该属性仅解析为全局命名空间。

这方面有一项工作--使用数据绑定。

你拥有的地方:

代码语言:javascript
复制
<div data-win-control="WinJS.UI.ListView"
     data-win-options="{ itemDataSource : colorsDataSource.dataSource, 
     itemTemplate: select('#color')}">  
</div>

itemsDataSource中删除data-win-options,并将其移动到数据双赢绑定:

代码语言:javascript
复制
<div  data-win-control="WinJS.UI.ListView"
      data-win-options="{ itemTemplate: select('#color')}"
      data-win-bind="winControl.itemDataSource: colorsDataSource.dataSource">  
</div>

这假设colorsDataSource是正在呈现的项的属性。例如,你的行对象。

为了解决嵌套问题,您的“父”列表视图可能会消失--只需根据数据源动态创建元素即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13218412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档