2013-09-26 4 views
0

Когда я сохраняю наблюдаемый файл IndexedDB, я получаю DataCloneError.KnockoutJS с IndexedDB - DataCloneError

E.g. используя IDBWrapper: https://github.com/jensarps/IDBWrapper

store = new IDBStore({ 
    storeName: 'myStore', 
    keyPath: 'Id', 
    autoIncrement: true, 
    onStoreReady: loadCallback 
}); 

... 

var myObservable = ko.observable("value"); 

... 

store.put(myObservable, refreshCallback); 

Что бы лучший способ работать вокруг этого? Кто-нибудь еще это занялся?

У меня довольно сложный наблюдаемый объект объекта, который содержит наблюдаемые и не наблюдаемые, поэтому просто захват значений будет немного повторяющимся.

UPDATE:

До сих пор я пытался ko.toJS которого многообещающий (http://knockoutjs.com/documentation/json-data.html), однако, потому что я также использую флаг isDirty с некоторыми из моих наблюдаемых (см здесь: http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html) это преобразуется в функцию поэтому мне все равно придется иметь дело с этим вручную ... Я мог бы до ko.toJSON, так что все это стягивается, но тогда было бы сложнее преобразовать это обратно в наблюдаемый формат по сравнению с просто установкой каждого значения вручную?

Так в настоящее время я просто делаю это:

var myObservable = ko.observable("value") 

... 

var plainValue = myObservable(); 
store.put(plainValue, refreshCallback); 

Только у меня есть observableArray варьирования содержания, так что я должен сделать много проверок, чтобы убедиться, что значения наблюдаются или нет, и если да, то разворачивайте их и храните их отдельно. Кажется немного грязным. Есть ли лучший способ?

+0

Показать код, используемый для сохранения наблюдаемого. – ebohlman

+0

Я сделаю обновление ... –

ответ

1

DataCloneError возникает, когда объект could not be serialized. Я предпочитаю простой старый javascript-объект (JSON) для хранения в indexeddb. Таким образом, ваше решение предпочтительнее. Обычно у меня будет конструктор для myObservable из сериализованного объекта JSON. Это чистое и будущее доказательство. По какой-то причине, если вы хотите изменить myObservable, вы все равно можете создать экземпляр из старого и нового JSON.

Смежные вопросы