0

当我将一个 observable 保存到 IndexedDB 时,我得到一个 DataCloneError。

例如使用 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,所以仅仅抓取这些值会有点重复。

更新:

到目前为止,我已经尝试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,所以我必须做很多检查以查看值是否可观察,如果是,则打开它们并将它们分开存储。好像有点乱 有没有更好的方法?

4

1 回答 1

1

无法序列化对象时发生 DataCloneError 。我更喜欢将普通的旧 javascript 对象 (JSON) 存储在 indexeddb 中。因此,您的解决方案更可取。一般来说,我会有myObservable来自 JSON 序列化对象的构造函数。它是干净的和面向未来的。出于某种原因,如果您想更改myObservable,您仍然可以从新旧 JSON 实例化。

于 2013-09-29T02:42:45.187 回答