我确信这非常简单,但目前对我来说并不明显。
我有一个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.js文件处理home.html中的所有内容,我只是不确定如何访问该数组并清空它?正如我所说,我确信这很容易,但我不知道如何实施它。
答案 0 :(得分:4)
要理解的第一点是WinJS.Binding.List如何与您创建它的数组相关。构造时,List会创建自己的map数组,其中包含对数组项的引用。因此,如果更改数组中项目的属性,它们也会在列表中更改。但是,如果清除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()来获取最后一个。