我现在已经使用木偶一周了,它真的让我的生活更轻松!
现在我需要能够在提取集合或模型时通知用户,因为某些视图需要花费大量时间来呈现/获取。举个例子,我做了一个小样本:
当用户点击某个类别时,需要加载该类别中所有项目的集合。在获取集合之前,我想显示加载视图,如图所示(视图1)。实现这一目标的优雅解决方案是什么。我发现以下帖子中用户启用了获取触发器:http://tbranyen.com/post/how-to-indicate-backbone-fetch-progress。这似乎有效,但并不像我想的那样。我想出了这个:
var ItemThumbCollectionView = Backbone.Marionette.CollectionView.extend({
collection: new ItemsCollection(userId),
itemView: ItemThumbView,
initialize: function(){
this.collection.on("fetch", function() {
//show loading view
}, this);
this.collection.on("reset", function() {
//show final view
}, this);
this.collection.fetch();
Backbone.history.navigate('user/'+identifier);
this.bindTo(this.collection, "reset", this.render, this)
}
});
如果我可以有一个名为'LoadItemView'的可选属性,那就太好了。这将在获取期间覆盖itemView。在您看来这是一个很好的做法吗?
答案 0 :(得分:1)
几天前,Derick Bailey在Marionette Wiki上发布了一个可能的解决方案:https://github.com/marionettejs/backbone.marionette/wiki/Displaying-A-%22loading-...%22-Message-For-A-Collection-Or-Composite-View
答案 1 :(得分:0)
var myCollection = Backbone.Marionette.CollectionView.extend({
initialize: function(){
this.collection.on('request', function() {
//show loading here
})
this.collection.on('reset', function() {
//hide loading here
})
this.collection.fetch({reset: true})
}
})
我觉得现在好多了。
答案 2 :(得分:0)
使用Backbone同步方法
除了直接ajax * / 之外,每次请求都会听到同步应用程序的骑行Backbone._sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
// Clone the all options
var params = _.clone(options);
params.success = function(model) {
// Write code to hide the loading symbol
//$("#loading").hide();
if (options.success)
options.success(model);
};
params.failure = function(model) {
// Write code to hide the loading symbol
//$("#loading").hide();
if (options.failure)
options.failure(model);
};
params.error = function(xhr, errText) {
// Write code to hide the loading symbol
//$("#loading").hide();
if (options.error)
options.error(xhr, errText);
};
// Write code to show the loading symbol
//$("#loading").show();
Backbone._sync(method, model, params);
};
答案 3 :(得分:0)
一般情况下,我建议在获取数据时加载预加载器,然后显示集合。类似的东西:
region.show(myPreloader);
collection.fetch().done(function() {
region.show(new MyCollectionView({ collection: collection });
});