Firebase到localStorage

时间:2015-02-05 16:20:45

标签: javascript jquery firebase

我想将对象保存为本地存储,作为离线渲染的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>

1 个答案:

答案 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());
    });
});