【问题标题】:Firebase to localStorageFirebase 到本地存储
【发布时间】:2015-02-05 16:20:45
【问题描述】:

我想将一个对象作为 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"}

【问题讨论】:

  • 如果您处于离线状态,您将如何从 Firebase 获取数据?问题是代码是异步的。它不会存在于回调闭包之外,您需要在回调中触发一个函数,将数据作为 arg 传递并进行 isOffline esq 检查
  • Natedog — 我尝试稍微修正一下语法和问题结构,但我不确定您在笔记中的确切含义。是不是回调内myDataGroup变量的值是回调外的null(或{})?
  • 还没有写那个函数。不会有冷启动。应用程序将最初在线连接,然后在每次页面刷新时更新。当离线应用程序将恢复为 localStorage 'array'。将来会快速添加对时间戳的检查,以便之后快速更新本地存储。
  • Jordan - 除非 setItem 在函数内移动,否则没有开发控制台在回调时显示空字符串。上面的数组只是 firebase 'table' (nosql) 格式的副本 - 它有国家作为美国,然后各种州作为键/值,美国作为链接事件的索引
  • 我看到了代码、数据和语句/注释。但是你的问题是什么?

标签: javascript jquery firebase


【解决方案1】:

您的代码正在响应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());
    });
});

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 2015-11-05
    • 1970-01-01
    • 2021-05-18
    • 2017-02-18
    • 1970-01-01
    • 2021-05-27
    • 2018-01-15
    • 2015-05-22
    相关资源
    最近更新 更多