使用EmberData在本地存储中缓存远程数据

han*_*s_l 41 ember.js ember-data

我有一个关于使用Ember加载和缓存远程对象的问题.我正在开发一个Ember应用程序,它通过REST API使用服务器端存储.某些获取的数据很少更改,因此每次加载应用程序时都不需要从服务器获取数据.但这也是需要脱机工作并仍然将其数据保存到服务器的应用程序的问题.

Ember Data有一个内置的存储适配器,用于通过REST API保持模型,还有一个适用于本地存储的适配器(如下面Ken所指出的).问题(如果它是一个问题)是一个模型只有一个存储适配器,似乎没有任何缓存提取模型的概念,除了将它们保留在内存中.

我在这个Ember愿望清单Tom Dale对此演讲的评论中发现了类似的请求,但我没有发现任何迹象表明这将是Ember的现有功能.

我有两个问题(第一个是重要问题):

  1. 今天最好的方法是在本地存储中实施缓存模型并根据需要将它们与远程数据同步?
  2. 这是一个计划包含在Ember中的功能,还是至少应该最终添加维护者认为的东西?

谈到1),我可以想到几个策略:

a)扩展现有适配器并添加自定义远程同步机制:

App.Store.registerAdapter('App.Post', DS.LSAdapter.extend({
  // do stuff when stuff happens
}));
Run Code Online (Sandbox Code Playgroud)

b)维护单独的模型类 - 一组用于远程对象,一组用于本地对象 - 并根据需要在它们之间进行同步.使用标准Todo案例:

RemoteTodo –*sync*– Todo
                     |
                     UI
Run Code Online (Sandbox Code Playgroud)

我有点希望这是一个真正的菜鸟问题,并且有一个很好的既定模式.

更新:发现了类似的问题.它有一个很好的答案,但它是理论上的.我认为我需要的是一些动手技巧或示例实现的指针.

Mic*_*ter 5

只是为了"碰撞"这个帖子一点点,因为当我研究用于缓存api的本地缓存等的解决方案时,它是最好的结果之一:

Dan Gebhardt似乎在使用Orbit.js并将其整合到Ember中做得非常好:https: //github.com/orbitjs/ember-orbit

Orbit是一个独立的库,用于协调对数据源的访问并保持其内容的同步.

Orbit为在客户端应用程序中构建高级功能提供了基础,例如脱机操作,本地缓存的维护和同步,撤消/重做堆栈和临时编辑上下文.

Orbit.js功能:

  • 支持应用程序中的任意数量的不同数据源,并通过通用接口提供对它们的访问.

  • 允许不同来源的请求得到满足,包括指定优先级和后备计划的能力.

  • 允许记录跨源同时存在于不同的状态.

  • 协调各个来源的转换.尽可能自动合并处理,但允许完全自定义控制.

  • 允许阻塞和非阻塞转换.

  • 允许同步和异步请求.

  • 通过跟踪操作的反转来支持事务和撤消/重做.

  • 使用纯JavaScript对象.

不要错过他关于Orbit:Orbit.js简介的精彩演讲和幻灯片

(更新:我在Orbit页面中添加了一些更具描述性的信息,因为我的帖子被"投票"用于"仅仅"引用外部资源而不包含实际的解决方案.但Orbit在我看来就像是解决方案,而且是"唯一的方法"包括"这是通过链接."


ken*_*ken 3

您可能会发现本地存储适配器的实现很有用。看看https://github.com/rpflorence/ember-localstorage-adapter

  • 是的。这就是你在我的问题中实施 b) 的方式。但我仍然想知道最好的方法。 (4认同)