获取集合或模型时触发加载视图

时间:2012-08-10 14:14:58

标签: backbone.js marionette

我现在已经使用木偶一周了,它真的让我的生活更轻松!

现在我需要能够在提取集合或模型时通知用户,因为某些视图需要花费大量时间来呈现/获取。举个例子,我做了一个小样本:

http://i.stack.imgur.com/IU3BP.png

当用户点击某个类别时,需要加载该类别中所有项目的集合。在获取集合之前,我想显示加载视图,如图所示(视图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。在您看来这是一个很好的做法吗?

4 个答案:

答案 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 });
});