2013-09-26 68 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); 

什麼是解決此問題的最佳方法?有沒有人解決這個問題呢?

我有一個相當複雜的observableArray對象,它包含observables和non-observables,所以只需要抓取這些值會有點重複。

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

當對象could not be serialized發生DataCloneError。我更喜歡普通的舊JavaScript對象(JSON)存儲在indexeddb中。所以,你的解決方案是可取的。通常我會從JSON序列化對象中爲myObservable構造函數。這是乾淨的和未來的證明。出於某種原因,如果你想改變myObservable,你仍然可以從舊的和新的JSON實例化。