带有websockets(sockjs)的主干(更改Backbone.ajax vs Backbone.sync)

时间:2016-01-27 22:34:47

标签: ajax backbone.js websocket marionette sockjs

我有一个困惑 - 如果我在websockets (sockjs)Backbone之上实施Marionette,那么,在我看来,它应该只需要更改Backbone.ajax函数,以便socket.emit socket.onmodel.save (or collection.save)支持model.fetch (or collection.fetch)

但是,当我做一些研究时,我发现事实并非如此。我遇到了 -
 1. Derick Bailey的文章:
https://lostechies.com/derickbailey/2012/04/19/decoupling-backbone-apps-from-websockets/
甚至没有谈到改变Backbone.ajaxBackbone.sync,而是建议事件聚合 - 这是使用websockets的解决方案但是错过了同步模型和集合的全部要点。好吧,它确实讨论了backbone.iobind,但只提到它作为事件聚合的“替代”方法(但是,这只是我对文章的阅读,我可能错过了一些东西!)。

 2. Christopher Keefer的文章:http://artandlogic.com/2014/06/websockets-for-backbone/
它完全符合我的要求(在socket.io上),但它通过改变除{{1}之外的Backbone.sync的部分来完成工作。 }}!

我的问题是Backbone是否可以通过更改其Backbone.ajax函数来为sockjs工作?

1 个答案:

答案 0 :(得分:1)

如果要更改持久性方法,则应覆盖Backbone.sync

Backbone.sync

  

您可以覆盖它以使用其他持久性策略,例如 WebSockets ,XML传输或本地存储。

强调我的

Backbone.sync是您访问持久层的途径。默认情况下,这是使用AJAX处理的,在大多数情况下使用jQuery AJAX。

Backbone.ajax

  

如果你想使用自定义AJAX函数,或者你的端点不支持jQuery.ajax API,你需要调整一些东西,你可以通过设置Backbone.ajax来实现。

强调我的

Backbone.ajax只是jQuery AJAX的代理:

Backbone.ajax = function() {
  return Backbone.$.ajax.apply(Backbone.$, arguments);
}

文档明确说明何时要覆盖Backbone.ajax。另一个不切实际的例子是当你使用另一个DOM操作库代替jQuery时,它没有内置使用ajax方法公开的AJAX支持。

Backbone.sync方法包含假定您正在使用AJAX的代码(它操纵xhr对象)。那是你应该覆盖的东西。 使用ajax方法做一些不是ajax的事情甚至没有意义。