2014-10-08 3 views
0

Я разрабатываю приложение для Windows 8 Store с использованием HTML/JavaScript, и я столкнулся с проблемой хранения и извлечения WinJS.Binding.List в Windows.Storage.ApplicationData .current.roamingSettings.Хранить и извлекать WinJS.Binding.List в данных приложения

Я получил это, чтобы вручную обработать собственный метод преобразования списка привязки в строку XML и сохранить его, а затем при извлечении его анализа в список. Но это кажется сумасшедшим неэффективным, и я пытаюсь найти лучший способ. Я пробовал JSON.stringify() и JSON.parse(), которые, похоже, хранят и извлекают нужные данные, но как только я привязываю данные к winControl, приложение вылетает с 0 (вообще не появляется сообщение об ошибке).

Вот немного моего кода, чтобы продемонстрировать то, что я пытаюсь (список является обязательным список):

function onSaveData() { 
    if (list) { 
     Windows.Storage.ApplicationData.current.roamingSettings.values["data"] = JSON.stringify(list); 
    } 
} 

function onLoadData() { 
    var data = Windows.Storage.ApplicationData.current.roamingSettings.values["data"]; 

    if (data) { 
     list = JSON.parse(data); 
     var listview = element.querySelector("#mylistview").winControl; 
     listview.itemsSource = new WinJS.Binding.List(list); 
    } 
} 

Я знаю, что могу получить эту работу на долгий путь, так что я не ищу любое решение ... Я действительно надеюсь, что есть простой способ хранить/извлекать эти объекты данных, которые мне не хватает. Если я смогу найти более простой способ сделать это, он устранит около 40 строк кода, и я могу прекратить использовать всю библиотеку. Кроме того, по мере того, как я продвигаюсь вперед, я планирую иметь больше списков привязки, которые также нужно будет сохранить. Благодаря!

ответ

2

Вы должны связать свойству DataSource в списке, а не к самому списку:

listview.itemsSource = new WinJS.Binding.List(list).dataSource; 

Источник данных свойство конкретно IListDataSource, что ListView требует для источника данных. ListView ничего не знает о WinJS.Binding.List напрямую, только через этот конкретный интерфейс. (Я обсуждаю это в главе 7, раздел «Структура источников данных», в моей бесплатной электронной книге, Programming Windows Store Apps with HTML, CSS, and JavaScript, 2nd Edition.)

Ваша сохранность и перезагрузка списка с помощью JSON полностью прекрасна.

+0

Ах. «listview» в моем примере выше - это настраиваемый элемент управления, который обертывает фактический ListView. itemsSource устанавливается фактическим списком и внутренне использует dataSource для установки ListView. Вы ответили на мой вопрос, хотя об экономии и перезагрузке с помощью JSON. Это просто означает, что у меня есть что-то еще. Благодарю. – BrianLegg

+0

Вам нужно убедиться, что ваш сериализованный JSON действительно представляет собой массив, так что он станет массивом JavaScript при его перезагрузке, иначе List не сможет его инициализировать. –