2

我正在用backbone.js 构建一个应用程序,现在我想在backbone.js 向服务器发出http 请求时添加一个全局加载效果,这是一个单页webapp,所以有很多异步http 请求。我想我可以修改 Backbone.sync 方法来简化它。我怎样才能做到这一点?

发布代码示例

// let's say there is a function to generate the loading and remove it
// mask.create();
// mask.remove();
var BookList = Backbone.Collection.extend({
    model:Book,
    url:'/api/list/1',
});

    var list = new BookList();

list.bind('reset', function(){
    $('.content').html('');
    list.each(function(book){
        self.addOne(book);
    })  
});
    list.fetch();
4

2 回答 2

3

听起来您希望将显示器连接到同步以获取 UI 反馈。不过,您不想混淆关注点,因此您不希望同步本身关心演示文稿。默认同步实现提供了一些事件(文档中可能包含更多事件):

每当模型或集合开始与服务器同步时,就会发出“请求”事件。如果请求成功完成,您将收到一个“同步”事件,如果没有,您将收到一个“错误”事件。

因此,您可以从绑定到这些事件开始,但无论哪种方式,您都应该坚持某种方法,其中“同步”仍然专注于其职责。

于 2013-01-29T03:16:27.790 回答
2

@MattWhipple 关于关注点分离是绝对正确的:您不应该将 UI 逻辑混合到持久层。但是,这并不意味着您不应该重写 Backbone.sync 方法,只要您提供一个解耦机制来分离关注点。

一种这样的机制是mediator模式,即使用全局事件总线来发布和使用消息。碰巧的是,Backbone 提供了这样一种带有事件全局Backbone对象的机制。您可以覆盖同步以触发事件:

Backbone.trigger("request:start");

并在 UI 层监听:

Backbone.on("request:start", callback);

这样,两层都不必相互了解,仍然可以实现全局请求处理。

此外,如果您只想捕获所有 AJAX 请求并且不关心它们是否来自 Backbone,那么您可以降低一层来监听 jQuery 的全局事件,而完全不考虑 Backbone。

于 2013-01-29T07:37:29.003 回答