处理Web应用程序中的脱机数据

时间:2018-02-28 16:21:39

标签: angular ngrx

当前堆栈:Angular 1.6,BreezeJS(处理离线/在线),. net web api,azure sql

转移到Stack:Angular 5,NgRx(处理离线/在线),. net核心Web API,Azure SQL

背景 我有一个必须离线/在线工作的Web应用程序。当用户处于连接环境中时,我使用Web worker来下载他们正在处理的项目的最新数据,并将该数据存储在本地存储中。当他们离线时,我从该本地存储中推/拉数据以允许用户脱机工作。现在,系统是使用Angular 1.6构建的,BreezeJS在离线时处理元数据实体,后续同步一次在线。这很有效,因为BreezeJS在处理所有离线元数据和后续同步方面做得非常好,非常透明和一致。

我需要将系统升级到Angular 5并且我想从堆栈中删除BreezeJS(主要是因为他们没有为Angular构建的打字稿更新,似乎没有任何计划创建一个)但我不是确定如何处理离线数据以及将离线数据同步到在线。我目前的计划是NgRx代替BreezeJS。

我正在考虑使用Service Worker在离线时将请求转储到本地存储的队列,同时更新当前存储(使用ngrx通过一个表明记录为未经证实的独特操作),无论如何。然后,当用户重新联机时,我会运行请求队列,然后更新用户的本地存储,因为响应正常进入。我还会更新我的Web工作者,以便他们在数据检索时推动操作,更新ngrx存储,然后将其内容转储到本地存储,以便在需要时可以脱机使用。

问题: 我意识到我实际上迫使NgRx在离线/在线工作。这是对NgRx库的良好用法,还是将该库从上下文中删除并将其用于从未用于它的东西?

是否有现成的生产就绪和维护库,用于处理Angular应用程序中的脱机数据和同步?

提前收到任何帮助。

2 个答案:

答案 0 :(得分:3)

哇。这很多都是非常不正确的。

BreezeJS适用于所有版本的Angular。它在TypeScript中重新编码,现在作为TypeScript库维护。我们在实践中广泛使用它,在最新的Angular版本中构建大型企业应用程序。它由原作者维护。

我应该知道。我是Breeze制造商IdeaBlade的创始人和现任总裁。

我也非常了解ngrx。您可以序列化商店的状态并将其恢复,但这样做并不容易,并且不像Breeze实体缓存那么容易。您可以尝试捕获操作流并重放它们。这也将充满困难。

你听起来不像是试过ngrx来管理实体的人。除了最小的实体模型之外,这是一项艰巨的任务。在你实现这一飞跃之前,你最好先学习一下。我说这是一个开创图书馆以使ngrx实体管理变得更容易的人(查找ngrx-data)。

但最重要的障碍是IMO完全缺乏对ngrx或redux中实体关系的支持,这对关系实体模型至关重要,而且是Breeze核心优势之一。

如果你习惯了Breeze,在你放弃它之前要非常非常仔细地看。

答案 1 :(得分:1)

Ngrx可以离线使用,只需使用像idb.js这样的库将状态存储在browseredDB等浏览器数据库中。您还可以使用lazloading动态加载数据切片。使用模块加载Effects forFeature时,使用效果初始化完成所有操作,这里有一个链接,可以使用示例代码Is the ngrx store persistent?回答您的问题。 Ngrx定期更新,他们有PWA和数据同步的计划等等。