在backbone.js中缓存集合?

Ind*_*ial 9 ajax caching backbone.js

什么是确保我的集合保持缓存从而只获取一次的最佳方法?

我应该实现某种缓存层吗?我应该将Collection变量分享到需要的地方吗?我可以信任jQuerys AJAX设置吗?($.ajaxSetup ({ cache: true });)

现在看起来是基本的集合:

theCollection = Backbone.Collection.extend({
    model: theModel,
    url: "source.json"
});

if (typeof myCollection === 'undefined') {
    var myCollection = new theCollection; // Only allow it to be created once
}
Run Code Online (Sandbox Code Playgroud)

Pro*_*Tom 16

我会在你的情况下实现一种集合管理器:

var manager = (function(){

  var constructors = {
    'example': ExampleCollection
  };
  var collections = {};

  return {
    getCollection: function(name) {
      if(!collections[name]) {
        var collection = new constructors[name]();
        collection.fetch();
        collections[name] = collection;
      }
      return collections[name];
    }
  }
})();
Run Code Online (Sandbox Code Playgroud)

这里管理器负责实例化集合并获取它们.你打电话的时候:

var exampleCollection = manager.getCollection('example');
Run Code Online (Sandbox Code Playgroud)

你得到一个示例集合的实例,其数据已经被提取.每当您再次需要此集合时,您可以再次调用该方法.然后,您将获得完全相同的实例,无需再次获取它.

这只是一个非常简单的管理器示例,您可以实现和增强许多其他功能.

我强烈建议不要在较低级别处理此问题(例如$ .ajax的传输层).如果这样做,您将阻止多次获取集合,但最终会在应用程序周围放置具有相同ID的不同模型实例.每个集合实例都会创建自己的模型.

在我目前正在开发的CouchApp中,我还发现有必要防止不同集合中的重复模型实例(不同的db视图可以返回相同的模型数据).这已经通过在管理器中具有单独的集合来解决,该集合跟踪已经加载到应用程序中的所有模型.

最后但并非最不重要的是,您可能会考虑在集合或管理器中实现刷新方法,该方法将处理从服务器更新集合.如果使用fetch方法执行此操作,则会重置整个集合,以便销毁所有模型,然后重新创建.如果您在应用程序中的其他位置引用此集合中的模型(通常情况下这样做),那么这很糟糕.那些实例已经过时并在您的应用中重复.刷新方法检查具有传入ID的较低实例已存在于curent集合中.如果是这样,他们会更新,否则他们会被添加.