[英]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上增加了一些功能。
对于Model
和Collection
他们添加了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.