1

我想知道是否可以在客户端存储/恢复Ember.TEMPLATES缓存对象localStorage

我想这样做的原因是因为我一开始并没有向客户端发送整堆预编译模板,而是从后端服务器“按需”加载它们。现在,如果用户决定重新加载浏览器,我想保存/恢复整个Ember.TEMPLATES对象,以便客户端不需要再次查询后端服务器以获取已请求的模板文件。

我可以localStorage使用以下函数将模板存储在其中,但我想它根本不漂亮(或性能优化):

saveCacheToLocalStorage: function() {
  var stringifiedCache = "{ ";

  for(var tmpl in Ember.TEMPLATES) {
    stringifiedCache += JSON.stringify({name: tmpl, template: Ember.TEMPLATES[tmpl].toString()});
  }

  stringifiedCache += " }";

  localStorage.setItem(this.localStorageId, stringifiedCache);

  this.hasChanged = false;

  return true;
}

但是如果我尝试从localStorage它解析字符串化的值,它会因为Syntax Error: Unexpected token: {. 我的问题有更好的解决方案吗?

一开始我无法提供所有预编译的模板,因为 Web 应用程序的用户访问不同的区域并使用 Web 应用程序的不同功能,因此向每个用户提供全套模板是不可接受的。

编辑

我的脚本中有一些错误,现在我可以localStoragelocalStorage. 不知何故,我无法从Ember.TEMPLATES自身获取模板,因为我总是得到相同的功能作为回报,这是非常没用的(一些关于弃用警告的一般内容等)。

4

2 回答 2

1

您不能,即使语法正确,它仍然无法工作,因为模板函数已生成并包含闭包(作用域)信息。

您最好的选择是将所有模板预编译为一个templates.js并使用(滥用)localStorage缓存整个模板脚本。(手动,或使用http://addyosmani.github.io/basket.js/

请注意,这localStorage是同步的,因此它会阻塞并可能会挂起浏览器以获取大型模板脚本。

于 2013-06-17T13:53:23.427 回答
0

如果必须这样做,请不要缓存已编译的模板(它们是函数,不能存储在 localStorage 中)。您可以缓存模板本身,并在从 localStorage 中读取它们时重建已编译的模板。(请记住在需要时自行使模板过期。localStorage 不会自行过期。)

于 2013-06-18T00:28:21.703 回答