【问题标题】:Backbone.js Singleton CollectionBackbone.js 单例集合
【发布时间】:2014-04-03 06:37:12
【问题描述】:

我正在使用 Backbone.js 和 require.js 构建一个应用程序。我的集合通过 fetch() 函数从后端获取数据。现在我有一个例子,其中 fetch 函数很昂贵,并且这个特定集合的数据不会改变,我会有更多的集合。所以我想将数据/集合保存在内存中。但我正在为实施而苦苦挣扎。我想保留 require.js 提供的延迟加载。处理这个问题的常用和“干净”方法是什么?

【问题讨论】:

  • 能解释一下为什么 fetch 很贵吗?我的意思是,你不必叫它......
  • @MildFuzz 从后端获取数据。这是一种静态数据,只能获取一次。所以我必须调用 fetch() 但只有一次。
  • @Evgeniy 我不使用同一个实例。所以我不能将它存储在实例本身上。
  • 好吧,没关系,只调用一次。完成....

标签: javascript backbone.js requirejs


【解决方案1】:

使用 javascript 闭包,例如:

var getCollection = (function(){
  var coll;

  return function(){
    if( ! coll){
      coll = new MyCollection();
      coll.fetch();
    }
    return coll;
  }
}());

第一次调用getCollection 时,将获取集合。然后,每个后续调用都会得到缓存的值。

有关此类模式的更多信息,请查看 Stoyan Stafanov (http://shop.oreilly.com/product/9780596806767.do) 撰写的“Javascript 模式”

【讨论】:

  • 好了,实现单例模式即可。 :) 此刻我问了我应该考虑的问题。 :D
  • 不,单例模式并不简单。你能解释一下为什么它适用于闭包吗?还是我应该使用谷歌? :)
  • 要获得详细的答案,您需要 Google 或链接的书。本质上,coll 变量可以在创建并分配给getCollection 的函数的闭包内访问。因此,您可以使用coll 来存储单例值,如果已定义则返回它。
  • 好的,谢谢。但我又想到了一件事。通常我会在集合中使用“window.collection.foo = new FooCollection()”,而不是使用闭包。他们每个人都有优点/缺点吗?
  • 问题是你永远不会知道window.collection.foo 是否被初始化。所以你基本上会在你的代码中到处检查。相反,您应该将我的答案中的代码分配为window.collection.getFoo
猜你喜欢
  • 2012-05-10
  • 2012-10-30
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 2011-12-19
  • 2014-03-12
  • 2012-11-30
相关资源
最近更新 更多