backbone.js - 如何以及何时显示微调器

Mat*_*hew 24 javascript jquery backbone.js underscore.js

在骨干中是否有任何类型的钩子,我可以很容易地说"无论何时任何集合都在获取数据,显示微调器,在它们完成时隐藏它"?

我觉得它会比这更复杂,需要覆盖特定的功能.我什么时候应该展示微调器?上fetch()或者refresh()还是其他什么东西?

rya*_*arc 36

您可以使用jQuery ajaxStart和ajaxStop.这些将在发出ajax请求时全局运行,因此获取和保存将导致它们运行.添加代码以在开始时显示微调器并将其隐藏到最后.

  • 如果页面进行其他无关的ajax调用,则此想法不起作用. (3认同)

roo*_*oo2 25

在Backbone.js 1.0.0中,您可以使用requestsync事件http://backbonejs.org/#Events-catalog 这在视图中.

    initialize: function(){
        this.items = new APP.Collections.itemCollection();
        this.items.bind('request', this.ajaxStart, this);
        this.items.bind('sync', this.ajaxComplete, this);
    }

    ajaxStart: function(arg1,arg2,arg3){
        //start spinner
        $('#item-loading').fadeIn({duration:100});
    },
    ajaxComplete: function(){
        $('#item-loading').fadeOut({duration:100});
    }
Run Code Online (Sandbox Code Playgroud)

这可以应用于每个集合或每个模型这里是一些CSS为旋转器http://abandon.ie/notebook/simple-loading-spinner-for-backbonejs


Sam*_*Sam 11

Backbone在Collection::fetch()启动时不会触发任何事件(请参阅源代码),因此您必须覆盖该fetch方法.也许是这样的:

var oldCollectionFetch = Backbone.Collection.prototype.fetch;

Backbone.Collection.prototype.fetch = function(options) {
    this.trigger("fetch:started");
    oldCollectionFetch.call(this, options);
}
Run Code Online (Sandbox Code Playgroud)

这将覆盖fetch方法,以便在提取开始时为您提供事件.但是,这只会触发特定集合实例上的事件,因此如果您有一堆不同的集合,则必须在每个集合上侦听该事件.

  • 如果你仔细阅读了其余的源代码,你会发现fetch调用sync,然后使用$ .ajax.您不需要监听骨干事件来附加微调器,您只需要注意ajax调用.jQuery ajaxStart和ajaxStop就是这么做的.http://documentcloud.github.com/backbone/docs/backbone.html#section-109 (25认同)
  • Nah @ryanmarc使用活动肯定有优势.我写了一篇关于此的帖子,http://tbranyen.com/post/how-to-indicate-backbone-fetch-progress ...同时确保你返回原始的fetch调用,否则原始的返回值会丢失. (3认同)
  • 请求,同步和错误事件是什么?http://backbonejs.org/#Events-catalog-他们似乎正是为了这个? (2认同)

and*_*y t 8

我没有覆盖主干的方式是:

在视野中

var myView = Backbone.View.extend({
  initialize; function(){

    this.$el.addClass('loading');
    collection.fetch(success:function(){
      this.$el.removeClass('loading')
    })
  }
})
Run Code Online (Sandbox Code Playgroud)

另一条路线是在添加模型时删除加载类,通常你有:

var myView = Backbone.View.extend({
  initialize; function(){
    _.bindAll(this, 'addAll')
    collection.bind('reset', this.addAll)

    this.$el.addClass('loading');
    collection.fetch();
  },
  addAll: function(){
    this.$el.removeClass('loading');
    collection.each(this.addOne);
  }
})
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,这些几乎是相同的,并且因为加载器实际上是用户体验在显示内容之前删除它是有意义的.