【问题标题】:Ionic 2 and JSON Data AdditionIonic 2 和 JSON 数据添加
【发布时间】:2017-01-17 05:18:10
【问题描述】:

我正在使用 Ionic 2 Storage 来保存表单数据。我这样保存数据:

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);
}

所以我知道 .push 用于数组而不是对象,但我认为进行所有这些转换并不高效,因为我正在处理大型对象。

我的问题是:从存储中检索 json 并附加到它的最有效方法是什么?如果对象没有像数组这样的推送方法,那么 .parse 返回一个对象对我来说毫无意义。

这是错误:

运行时错误未捕获(承诺中):TypeError:无法读取属性 未定义类型错误的“推送”:无法读取属性“推送”的 未定义

【问题讨论】:

  • 如果你的'report'存储为'json'对象,你会在json.parse()之后得到一个json对象。如果您已将“报告”存储为“数组”对象,您将在 json.parse() 之后返回一个数组对象。此上下文中的“对象”是一个 javascript 对象,可以是数组或普通对象的格式。

标签: javascript json ionic2


【解决方案1】:

这个错误的意思是,此时没有该键的记录。 所以,你必须做这样的检查:

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));
});

【讨论】:

  • 实际上,整个代码块在 if (report) 条件下运行,我只是将其排除在外以保持问题的重点。所以这仍然是一个问题。
  • 答案仍然有效。如果 report = [Array of json],则 .push() 将起作用。否则我们正在初始化 objReport = [Array]。所以推送仍然有效并将这个新数组保存到该位置。
  • 如果您想要更精细地控制 noSQL 数据,那么您将不得不使用更全面的 NoSQL 存储,例如 pouchDB。如果您要存储大量数据,我会推荐 /SQlite由于 ionic 的 this.storage 使用浏览器的 localStorage 存储在客户端的数据,其数据存储上限为 10MB,并且数据也可以轻松清除/丢失。
  • 那么问题出在存储时使用stringify吗?即使我将它们存储为对象,并摆脱字符串化和解析,它也不起作用!关于存储空间,Ionic 2 Storage 使用 SQLite(如果是本机)和 IndexedDB、WebSQL 和 LocalStorage(按此顺序)用于 web。
  • 你能用你的代码创建一个 plunkr 吗?然后,我将能够更好地帮助你..
猜你喜欢
  • 2017-11-11
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多