主干.js添加自定义同步以制作加载效果



我正在构建一个带有 Backbone 的应用程序.js,现在我想在 Backbone .js 向服务器发出 HTTP 请求时添加全局加载效果,这是一个单页 Web 应用程序,所以有很多异步 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();

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

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

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

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

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

Backbone.trigger("request:start");

并在 UI 层中收听它:

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

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

此外,如果你只想捕获所有 AJAX 请求,并且你不在乎它们是否来自 Backbone,你可以降低一级来监听 jQuery 的全局事件,而将 Backbone 完全排除在外。

最新更新