我想将对象保存为本地存储,作为离线渲染的JSON字符串。此时只需要写功能进行测试。我的问题是为什么只有一个键/值字符串(数组)写入localStorage?
这是我想要保存的对象。
Addr_states
-JhMZ6QjAm0FRAcRjivP
Country:
State:
-JhMdqTXuayd00hqkp_E
Country:
State:
-JhMgVVy_58upfBjf0sO
Country:
State:
-JhMjte-ujgsmxgyX8Zf
Country:
State:
-JhMkPrScGjvRNVna4Hp
Country:
State:
-JhOYj6j4lW4Y38wJDsN
Country:
State:
到目前为止,这是我的代码:
function myDataStore (myDataPass)
{localStorage.setItem("States", JSON.stringify(myDataPass));}
if (myStorageStatus == true)
{
if (myOnlineStatus == false)
{
myDataSource = "Local Storage";
}
else
{
myDataSource = "Web Firebase";
localStorage.removeItem("States");
var myDataRead = new Firebase('https://myappURL/Addr_states');
myDataRead.on('child_added', function(snapshot) {
myDataGroup = snapshot.val();
console.log(myDataGroup);
myDataStore (myDataGroup);
});
}
}
当将变量myDataGroup
转换为快照函数时,我将最后一个键/值数组作为字符串而不是键(在上面的对象中看到)或上次更新的元数据。在函数外部,结果显示(在开发人员控制台中)作为空对象。
myDataGroup
在代码块的顶部声明,超出了函数的范围。
更改为添加以下评论者建议的代码 - 在州中生成单个字符串(数组)最后一个 - 这个 - {“Country”:“USA”,“State”:“Utah”}
< / LI>答案 0 :(得分:4)
您的代码正在响应child_added
个事件:
var myDataRead = new Firebase('https://myappURL/Addr_states');
myDataRead.on('child_added', function(snapshot) {
A child_added
event fires for every child that is added under the indicated node。因此,在您的情况下:每个州都会触发child_added
事件。
这也意味着为每个州调用你的回调函数。然后,您使用该状态的信息覆盖本地存储中的任何内容:
myDataStore (myDataGroup);
基本上,您的本地存储现在将包含来自Firebase的最后状态。
鉴于您已将本地存储命名为States
,您似乎希望将所有状态存储在那里。通过收听Firebase的value
事件:
var myDataRead = new Firebase('https://myappURL/Addr_states');
myDataRead.on('value', function(snapshot) {
myDataGroup = snapshot.val();
console.log(myDataGroup);
myDataStore (myDataGroup);
});
如果您还希望循环各个州,可以使用forEach
:
var myDataRead = new Firebase('https://myappURL/Addr_states');
myDataRead.on('value', function(allStates) {
allStates.forEach(function(stateSnapshot) {
console.log(stateSnapshot.val());
});
});