1

我确信这非常简单,但目前对我来说并不明显。

我有一个 WinJS 列表视图(在 home.html 中定义):

<div data-win-control="WinJS.UI.ListView" id="listView" style="display: inline"
    data-win-options="{ 
        itemDataSource: NotificationData.itemList.dataSource, 
        itemTemplate: select('#notificationMenuTemplate'),
        layout: { type: WinJS.UI.ListLayout }}">
</div>

很容易。我的 itemDataSource 是一个 JavaScript 文件 (notificationData.js),定义如下:

(function () {
"use strict";

var dataArray = [
    { title: "Title 1", text: "Some text 1", time: "12 hours ago" },
    { title: "Title 2", text: "Some text 2", time: "17 hours ago" },
    { title: "Title 3", text: "Some text 3", time: "3 hours ago" },
    { title: "Title 4", text: "Some text 4", time: "18 hours ago" }
]

var dataList = new WinJS.Binding.List(dataArray);

var publicMembers =
    {
        itemList: dataList
    };
WinJS.Namespace.define("NotificationData", publicMembers);

})();

也很容易。在我的 listView 下方,我有一个按钮,我希望该按钮在按下时清除所有通知(因此清空数组)。我有一个处理 home.html 中所有内容的 home.js 文件,我只是不确定如何访问该数组并将其清空?正如我所说,我确信这很容易,但我不清楚如何实现它。

4

1 回答 1

4

首先要了解的是 WinJS.Binding.List 与您创建它的数组的关系。构造时,List 创建自己的映射数组,其中包含对数组项的引用。因此,如果您更改数组中项目的属性,它们也会在列表中更改。但是,如果您清除 dataArray(例如使用 pop),则 List 仍将保留对原始对象的引用,并且不会自行清除。

改变这种关系的一种方法是使用 WinJS.Binding.List 上的 { proxy: true } 选项,这意味着 List 使用底层数组作为自己的存储。然后,如果您清除数组或列表,则清除另一个。

如果没有代理选项,可以将数组视为 List 的初始值设定项,然后使用 List 的方法来管理其内容。在您的情况下,这是最有意义的,因为 dataArray 变量在其他任何地方都无法访问,也无法通过 List 访问。

无论如何,清除 Binding.List 最简单的方法是使用它的 splice 方法将其所有项目切掉,即调用 List.splice(0, List.length),或者您可以设置 List.length = 1 (它会拼接除一个项目之外的所有项目,因为不支持将长度设置为零),然后调用 List.pop() 以获取最后一个项目。

于 2013-07-19T17:15:19.800 回答