2017-01-17 17 views
0

フォームデータを保持するためにIonic 2 Storageで作業しています。私はこのようなデータを保存します。Ionic 2とJSONデータの追加

this.storage.set(key, JSON.stringify(formData)); 

そして私が取得し、このようにデータを更新しよう:

this.getReport(key).then((report) => { 
    var objReport = JSON.parse(report); 
    objReport.push(data); //this is the problem 
    this.storage.set(pk, JSON.stringify(objReport)); 
}); 

getReportはちょうどこのです:

getReport(key) { 
    return this.storage.get(key); 
} 

だから私はそれを知っています。プッシュは配列でありオブジェクトではありませんが、私は大きなオブジェクトを扱っているので、この変換をすべて効率的に行うことはできません。

私の質問はです。ストレージからjsonを取り出して追加する最も効率的な方法は何ですか?オブジェクトに配列のようなプッシュメソッドがない場合、.parseはオブジェクトを返します。このエラーが何を意味するのか

Runtime Error Uncaught (in promise): TypeError: Cannot read property 'push' of undefined TypeError: Cannot read property 'push' of undefined

+0

あなたの「報告書は」「JSON」オブジェクトとして保存されている場合、あなたは(json.parse後にJSONオブジェクトを取り戻すだろう)。 'report'を 'Array'オブジェクトとして保存していれば、json.parse()の後にArrayオブジェクトが返されます。この文脈における「オブジェクト」は、配列または通常のオブジェクトの形式であり得るjavascriptオブジェクトである。 –

答えて

0

が、現時点でそのキーのレコードがないということである。ここでは

はエラーです。 だから、あなたはこのようなチェックを行う必要があります:

this.getReport(key).then((report) => { 
    var objReport = [];//initialise empty Array 
    if(report){ //if there is a record in that key location 
    objReport = JSON.parse(report); //parse the record & overwrite objReport 
    } 
    objReport.push(data); //Now this push will happen regardless of report or not 
    this.storage.set(pk, JSON.stringify(objReport)); 
}); 
+0

実際には、コードブロック全体がif(report)条件内で実行されますが、質問を集中させるために除外しました。 これはまだ問題です。 – Muhammad

+0

答えはまだ立っています。 report = [Array of json]の場合、.push()が動作します。それ以外の場合でも、objReport = [Array]を初期化しています。したがって、プッシュは引き続き機能し、この新しいアレイをその場所に保存します。 –

+0

noSQLデータをより細かく制御したい場合は、pouchDBのようなより包括的なNoSQLストレージを使用する必要があります。クライアント側で大量のデータを保存する場合は、/ SQliteをお勧めします。このイオンストレージは、データストレージの上限が10MBであるブラウザのlocalStorageを使用し、データも簡単にクリア/ロストすることができます。 –

関連する問題