2013-07-19 58 views
1

我確信這非常簡單,但目前對我來說並不明顯。清除WinJS綁定JavaScript數組

我有這樣的(在Home.html中定義)一個WinJS列表視圖:

<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中的所有內容,我只是不確定如何訪問該數組並將其清空?正如我所說,我確信這很容易,但我不清楚如何實施它。

回答

4

要理解的第一點是WinJS.Binding.List如何與您創建的數組相關聯。構造時,List將創建自己的映射數組,其中包含對數組項的引用。因此,如果您更改數組中項目的屬性,它們也會在列表中更改。但是,如果清除dataArray(例如,使用pop),List仍然會保持對原始對象的引用,並且不會自行清除。

改變這種關係的一種方法是在WinJS.Binding.List上使用{proxy:true}選項,這意味着List使用底層數組作爲自己的存儲。然後,如果清除數組或清單,則清除其他數據。

如果沒有代理選項,請將該數組視爲List的初始化程序,然後使用List的方法來管理其內容。在你的情況下,這是最有意義的,因爲dataArray變量不能在其他任何地方訪問,並且無法通過List訪問。

無論如何,清除Binding.List的最簡單方法是使用其拼接方法砍掉其所有項目,即調用List.splice(0,List.length),或者您可以設置List。長度= 1(除了一個項目外,所有項目都會拼接,因爲不支持將長度設置爲零),然後調用List.pop()以獲取最後一個項目。

+0

所以考慮我的佈局是,我有一個notificationData.js綁定到我的listView在home.html,然後我有home.js顯然與home.html交互,我將如何訪問我的home.js中的數據數組文件?我可以只是得到listView元素,並調用listView.itemDataSource.splice(0,itemDataSource.length)...? –

+0

是的,你可以抓住ListView的itemDataSource並直接操作它。但是請注意,分配給該對象的是具有IListDataSource方法的對象,而不是WinJS.Binding.List,因此不會有拼接方法。如果要使Binding.List全局可訪問,請將其單獨添加到可從home.js獲得的命名空間。如果修改List,它也將更新ListView。 –