解決方法がわからない、複雑に思える問題があります。
私の単一ページ アプリケーションはノックアウト JS を使用しており、ビューで入力値の 1 つが変更されるたびにビュー モデルをキャッシュしたいと考えています。
問題があるのは、ビュー モデルの複雑さです。ローカル ストレージを使用するには、オブジェクトを文字列化する必要がありますが、再帰的な値があります。これを処理してオブジェクトを文字列化するロジックがあります。しかし、JSON 文字列を解析してオブジェクトに戻そうとすると、関数が失われます。
function cacheForm(agency) {
//var serialized = stringifyOnce(agency);
//var serialized = amplify.store("Agency", agency);#
//var obj = new Object();
//obj.test = "test";
value = agency;
var cache = [];
parsed = JSON.stringify(value, function (key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// Circular reference found, discard key
return;
}
// Store value in our collection
cache.push(value);
}
return value;
});
//var jsonString = JSON.stringify(cache);
//cache = null; // Enable garbage collection
var parsedRecursive = "{" + '"data"' + ":" + parsed + "," + '"expires"' + ":" + null + "}"; // Build the string based on how amplify likes it
var obj = eval('(' + parsed + ')')
var obj = jQuery.parseJSON(parsedRecursive);
//// Put the object into storage
//localStorage.setItem('Agency', parsedRecursive);
myData = JSON.parse(parsedRecursive, function (key, value) {
var type;
if (value && typeof value === 'object') {
type = value.type;
if (typeof type === 'string' && typeof window[type] === 'function') {
return new (window[type])(value);
}
}
return value;
});
//// Retrieve the object from storage
// var retrievedObject = localStorage.getItem('Agency');
// var obj = jQuery.parseJSON(parsedRecursive);
//var agency2 = mapping.fromJS(obj);
//agency;
//amplify.store("Agency", agency);
//amplify.store("Obj", obj);
//var store = amplify.store(); // Look at all items by not providing a key
}
});
eval を使用してみましたが、データのないオブジェクトが返されました。理解を助けるために、私のビュー モデルがどのように見えるかを説明します。これは、cachForm のエージェンシー パラメーターです。
また、増幅を使用してみましたが、ビューモデルの構造のために同じ問題が発生しました。
コード内のビューモデルで何が起こるかを示すスクリーンショットもいくつか添付しました。