TypeScriptでは、Web Storage APIの周りにラッパークラスがあります。ストレージを使いやすくするために、アプリケーションが保存する必要があるすべてのアイテムのクラスプロパティを初期化しました。以下は、(活字体で書かれた)私のラッパークラスWeb Storage:オブジェクトメンバを編集する方法
エクスポートクラス
get Storage(){return localStorage}
get testData(){return this.getItem('testData')}
set testData(val){this.setItem('testData',val)}
getItem(key:string){return JSON.parse(this.Storage.getItem(key))}
setItem(key:string, data:any){this.Storage.setItem(key, JSON.stringify(data))}
removeItem(key){this.Storage.removeItem(key)}
clear(){this.Storage.clear()}
アプリケーションの他の場所でStorageServiceがあり、私はオブジェクトtestData
とそのメンバーのプロパティと対話したいと思います。以下では正常に動作します:私はTESTDATAのプロパティを変更するのではなく、全体のオブジェクトを設定しようとした場合
storage.testData = {name:'Mary',age:6};
console.log(storage.testData); //initial object is retrieved
しかし、setItem
メソッドが呼び出されることはありませんし、ストレージの内容は変更されません。
storage.testData.age = 10;
console.log(storage.testData); //{name:'Mary',age:6} <- age was not changed
直感的な修正が最初にそれを更新し、保存されたオブジェクトを取得し、最終的にこれは小さなオブジェクト上の罰金ですが、それがうまくスケールしない更新された値
var temp = storage.testData;
temp.age = 10;
storage.testData = temp;
console.log(storage.testData); //{name:'Mary',age:10} <- age is updated
を格納することです。 testDataに50または60のプロパティがあり、アプリの複数のポイントで1つまたは2つだけ変更する必要があるとします。毎回すべての物件を設定する必要はありません。とにかく、私はアプリケーションの残りの部分を変更することができないかもしれません。私はストレージインターフェイスだけを提供します。
私の質問は、毎回保存するオブジェクト全体を提供するのではなく、ストレージ内のオブジェクトのプロパティを直接設定/変更できるストレージメソッドを公開するにはどうすればいいですか?理想的には、消費コードは現在格納されている値を編集するのにstore.testData.age = value
を呼び出すだけです。
PS:これは別のトピックの場合もありますが、localStorageにアクセスすると、多くの場合、アプリケーションの速度が遅くなります(最初のコメントのとおり)。おそらく、私のラッパーは値をメモリに格納することができますが、設定された間隔でそれらをすべてストレージにプッシュします。 3分ごとに?私は厳密にメモリオブジェクトにアプリケーションの状態を反映していましたが、ユーザーがページを移動したりページを更新したりすると、すべてが失われます。
多くの変更を加えたい場合は、変更するたびに文字列化してオブジェクト全体を格納するのが適切です。あなたの現在の方法(最後に保存する)は適切です。ちなみに、 'Storage'オブジェクトにはすでにゲッターとセッターがあります。 – Oriol
詳細をご覧ください。上記の両方の方法は、すべての変更時に文字列化する必要はありませんか?これは別の話題かもしれませんが、localStorageにアクセスするとたくさんのアプリが本当に減速しますが、意図したとおりにストレージを使用していない可能性があります。おそらく、私のラッパーは値をメモリに格納することができますが、設定された間隔でそれらをすべてストレージにプッシュします。 3分ごとに?私は厳密にメモリオブジェクトにアプリケーションの状態を反映していましたが、ユーザーがページを移動したり、ページを更新したりすると、すべてが失われます。 – BeetleJuice
を 'var temp = storage.testData'に置き換えてストレージにアクセスし、JSONを解析します。そうすれば、オブジェクトに膨大な量の変更を加えることができます。これはストレージに保存されません(高速です)。最後に、文字列化して 'storage.testData = temp'で保存します。 – Oriol