繁体   English   中英

我怎么知道我的馆藏已经有使用Backbone.JS的数据?

[英]How do I know my collection already has data using Backbone.JS?

我正在使用javascript框架BACKBONE.JS开发网站。 在我的网站上,有一个“类别选择”下拉列表。 使用Backbone集合获取,我成功地将类别下拉列表渲染了。 在标题中,我有三个水平菜单[如下图所示]。 用户单击菜单(使用骨干路由器完成页面导航)。 我这一天的主要内容将会改变。 用户可以根据类别过滤内容。 我的类别过滤器下拉选项不会经常更改。

水平菜单

我的路由器:

dealapp.AppRouter = Backbone.Router.extend({
    routes: {
        "": "home",
        "all/mobile": "mobile",
        "all/descktop": "displayAllVoucher"
    },
    home: function () {},
    mobile: function () {},
    desktop: function () {}
});

成功案例

我正在使用“ http://www.Site1.com/ ”加载我的网站。 函数home将获得呼叫并执行列出的操作。 如果我导航到其他选项卡(移动/桌面),则会显示我的类别下拉列表。[注意:我正在从home功能中的服务器中获取我的类别]

脚本

我正在直接使用“ http://www.Site1.com/#all/deal ”加载我的网站。 在这种情况下,我的类别下拉列表没有呈现,我得到了一个空的下拉列表。 我知道我还没有在手机和台式机的其他两个功能中添加类别获取。 如果我每次都在移动和桌面功能中包括类别获取,那么我的类别获取调用将转到服务器并从服务器获取数据。

我的疑问

我怎么知道我的收藏中是否已有数据? 我想重用已经下载的数据。 如果数据在本地存储中不可用,那么我需要从服务器获取数据。

您可以覆盖集合上的提取。 Fetch返回一个延迟的对象,您可以将其存储在集合本身上。 如果deferred为null,则将调用原型访存。 这样做的好处是,在代码中您总是调用fetch,并且如果集合中有数据,则返回缓存的数据。

fetch : function(options) {
  if(this.deferred){
    return this.deferred;
  }
  this.deferred = Backbone.Collection.prototype.fetch.call(this, options);
  return this.deferred;
}

其他人处理了这个特定的问题,并且可以找到一些插件。

我目前成功使用的是Thorax框架,它在Backbone上增加了一些功能。

对于ModelCollection他们添加了isPopulated()isEmpty()方法,如其文档所示

他们会告诉您集合中是否有数据。 如果您不想使用整个框架,只需从此处Git存储库复制代码即可。

简而言之,它们通过重写fetch来解决此问题,以在提取数据时将名为_fetched的属性设置为true。


另一种方法是缓存数据。 在大多数情况下,这是个好主意,但这要视情况而定。 在您的方案中,最好将其缓存在localStorage中。

我发现一个似乎可以完成工作的插件是Backbone fetch cache

描述:

该插件拦截对提取的调用,并将结果存储在缓存对象(Backbone.fetchCache._cache)中。 如果在选项中使用{cache:true}调用了fetch并且URL已被缓存,则AJAX调用将被跳过。


在此答案中还提到了另一个版本:是否在ribs.js中缓存集合?

正如回答者所说,您可以执行以下操作:

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];
    }
  }
})();

在这里,经理负责实例化集合并获取它们。 你打电话时:

 var exampleCollection = manager.getCollection('example'); 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM