【问题标题】:Is it possible to bind Firebase to local storage?是否可以将 Firebase 绑定到本地存储?
【发布时间】:2015-05-22 09:48:28
【问题描述】:

我已经阅读了很多关于 S.O. 的内容。关于离线(本地)存储和 AngularFire,我知道 AngularFire 旨在用于 Angular 模型和 DOM 的 3 路绑定使用。

具体参考How to sync offline database with Firebase when device is online?,我可以看到将本地存储引入组合并非易事。我不太了解该线程中“启动”Firebase 的概念。

但是,我确实需要能够在离线模式下启动应用程序。这是我的场景:

  1. 我正在构建一个访客列表应用,它可以在多个设备上同时运行,使用 Firebase 作为访客列表的后端存储。
  2. 如果设备签入来宾,它会传播到 FB,进而传播到其他设备。它应该在本地存储中保留最新的来宾列表副本。
  3. 在我居住的地方,3G 覆盖是一个大问题,因此有人可能会在连接后加载应用,关闭应用,然后移至其他位置,然后在没有信号时尝试打开应用。
  4. 在这种情况下,应用应使用本地存储访客列表。
  5. 当设备再次联机时,连接到 Firebase 并将本地存储更改上传到 Firebase。

我知道 Kato 也提到过 AngularFire 的未来版本中可能会提供离线存储功能 - 这还有可能吗?否则我的想法是这样做:

  1. 假设应用程序已在离线模式下启动,每次客人签入时,都会更新本地存储。还要在本地存储“所做的更改”变量中跟踪该更改。
  2. 当/如果设备重新联机,使用 AngularFire 将 Firebase 访客列表拉入 $scope.guestList 变量。
  3. 遍历本地存储中的“更改”列表,并对 $scope.guestList 变量进行更改。

感觉不是一个好方法,但我不知道还有什么其他方法。有没有办法直接将 Firebase 绑定到本地存储?

【问题讨论】:

    标签: local-storage firebase angularfire


    【解决方案1】:

    我决定在这种情况下最好不要使用 AngularFire,而是直接使用 Firebase SDK。 AngularFire 的 3 路绑定使得拦截 $scope 更改以放入本地存储非常困难。直接使用 SDK 可以拦截 FB 更改并将其直接保存到本地存储以及更新 $scope。

    同样,使用 ref.update() 对 FB 进行更改是微不足道的,并且可以与更新本地存储一起完成。

    如果应用在离线模式下启动(从 .firebasio.com/.info/connected 检测到),则只需使用本地存储,但也正如 Kato 建议的那样“启动”Firebase 连接。我通过简单地调用空白 ref.update({}); 来做到这一点。然后在对本地存储中的数据进行更改时,也运行正常的 FB 更新/推送/保存。然后当应用程序连接时,内存中的 FB 副本将与服务器同步。

    【讨论】:

    • 我遇到的问题是您设置或更新的数据在连接后将覆盖 Firebase 副本。例如,设置将清除您的子项,因此您必须调用更新。假设您的系统在晚上 9 点断开连接,但在晚上 10 点,firebase 上的某些内容被另一个客户端更新。然后在上午 9 点,您的本地副本(仍然断开连接)向本地版本的 firebase 添加更新,时间戳将显示您的本地副本为较新并覆盖服务器数据。我们通过仅提供读取访问权限来解决此问题,但它不是完美解决方案
    • @DennisSmolek 你必须为此实现服务器端或客户端逻辑
    • @Hollerweger 不确定你的意思.. 如果两个客户端写入“事件 A”已更改并且客户端 1 已连接,而客户端 2 未在客户端 2 连接后立即覆盖更改客户端 1制成。我们最终编写了一个更新集合,其中存储有日期戳。只有连接的客户端才能将他们的记录提取并保存到实时数据库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2018-06-15
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多