Backbone 与 websockets (sockjs)(更改 Backbone.ajax 与 Backbone.sync)

Backbone with websockets (sockjs) (changing Backbone.ajax vs Backbone.sync)

我有一个困惑- 如果我在 BackboneMarionette 之上实现 websockets (sockjs),那么,在我看来,它只需要更改 Backbone.ajax 函数,以便 socket.emitsocket.on 代替 model.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,但只提到它作为事件聚合的 "alternative" 方法(但是,这只是我对这篇文章的阅读,我可能错过了一些东西!)。

2. Christopher Keefer 的文章:
http://artandlogic.com/2014/06/websockets-for-backbone/
它完全符合我的要求(在 socket.io 上),但它通过更改 Backbone.sync 的部分内容来完成工作除了 Backbone.ajax

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

如果你想改变你的持久化方法,你应该重写Backbone.sync

Backbone.sync

You can override it in order to use a different persistence strategy, such as WebSockets, XML transport, or Local Storage.

(强调我的)

Backbone.sync 是通往持久层的门户。默认情况下,这是使用 AJAX 处理的,在大多数情况下使用 jQuery AJAX.


Backbone.ajax

If you want to use a custom AJAX function, or your endpoint doesn't support the jQuery.ajax API and you need to tweak things, you can do so by setting 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 的事情甚至没有意义。