【问题标题】:WinJS Navigation Template + ListViewWinJS 导航模板 + ListView
【发布时间】:2012-09-22 11:34:37
【问题描述】:

我已经开始使用导航模板并尝试将 ListView WinControl 放入页面(不是 home.html)。插入 HTML 可以正常工作,Javascript 也可以正常执行。

但是,当尝试使用 data-win-options 绑定列表视图时,我遇到了我在 JS 中的就绪处理程序中定义的命名空间尚不存在的问题,因此应用程序会抛出异常。

如果我在就绪事件之前定义命名空间,也不例外,但是我在就绪处理程序中执行的“公共”变量的更新不会反映在 ListView 中,只有当我再次导航回页面时ListView 是否正确填充了数据。

我发现现在让 ListView 工作的唯一方法是直接更新

document.getElementById('myListView').winControl.itemDataSource

这真的不是我想要的方式。我希望绑定在 HTML 中。

那么总结一下,在Navigation Template中绑定ListView的正确方法是什么?还是只有我一个人有这个问题?

【问题讨论】:

    标签: javascript listview navigation windows-8 winjs


    【解决方案1】:

    这里有几个活动部件。

    首先,因为您拥有数据源的变量不是“可观察的”——它不会通知任何人它已更改。这不是 JavaScript 本质上可以做到的。

    其次,您已经通过 data-win-options 存储桶传递了它——它只是捕获了值,并没有努力去观察它。

    有几种方法可以解决这个问题:

    a) 利用您找到的方式,但使您的变量可观察,并通过添加更改处理程序在其更改时传输值。这不是您想要的声明式,但也不错。

    var yourVariable = WinJS.Binding.as({ dataSource: null });
    yourVariable.bind("dataSource", function(oldVal, newVal) {
        document.getElementById("yourListView").winControl.itemDataSource = newVal;
    });
    
    yourVariable.dataSource = getMyDataYo();
    

    b) 在 HTML 中设置声明式绑定,并使用数据上下文调用 WinJS.Binding.processAll()。

    HTML:

    <div data-win-control="WinJS.UI.ListView"
         data-win-options="{ itemTemplate:... }"
         data-win-bind="winControl.itemDataSource: dataSourceProperty"
    </div>
    

    JS: 在您准备好的处理程序中:

    var dataContext = WinJS.Binding.as({ dataSourceProperty: dataSourceInstance });
    WinJS.Binding.processAll(element, dataContext);
    

    如果你保存了dataContext实例,当你以后用新的数据源设置dataSourceProperty时,listview会重新加载,并重新布局。

    【讨论】:

    • 根据我的有限理解,processAll 在 default.html 文件中只调用一次,之后的任何内容都由 navigator.js 处理。我的页面中没有 processAll。我是否必须声明这个可观察的全局并以每页为基础更改它的值?当我尝试添加新属性时它会识别还是只观察现有属性的更改?到目前为止,谢谢。
    • procesAll 可以随时随地调用。它需要一个元素,然后遍历 dom down 以寻找任何 data-win-binds。如果您不想全局声明您的源,为什么不直接在 page.ready 中设置它?上面的代码真的是你所需要的——第二种方法中没有什么是“全局的”。你只调用一次,然后当你将来分配给 .dataSourceInstance 时,“魔法”就会发生
    • 为了澄清,我想全局设置它,但我不想在应用程序开始时设置每个变量。当我在 page.ready 中设置全局变量时,为时已晚,因为页面已经尝试绑定到它并因此崩溃。
    • 如果是全局的,则不需要在读取中设置。在 app.start 中设置它。没有数据香料或未定义等的 Nada 列表视图不会崩溃 - 它只是不显示任何数据。您在我的帖子中获得了有关您的问题的所有信息 - 您可以使用最适合您需求的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多