使用backbone.js的非RESTful后端

use*_*636 2 rest websocket backbone.js

我正在评估backbone.js作为一个潜在的JavaScript库,用于一个应用程序,它将有一些不同的后端:WebSocket,REST和第三方库生成JSON.我已经阅读了一些意见,即只要api是"按书"并且遵循相应的http verbage,backbone.js就可以与RESTful后端一起工作.有人可以详细说明这意味着什么吗?

另外,让backbone.js连接到WebSockets有多麻烦?最后,将backbone.js模型与返回JSON的函数集成是否有任何问题 - 换句话说,数据模型是否总是需要通过REST提供?

Tol*_*oli 6

Backbone的强大之处在于它具有令人难以置信的灵活性和模块化结构.这意味着您可以使用,扩展,取出或修改Backbone的任何部分.这包括AJAX功能.

Backbone不"关心"您从何处获取集合或模型的数据.它将通过提供开箱即用的RESTful"ajax"解决方案来帮助您,但如果您想使用其他东西,它不会生气!

这允许您查找(或编写)您想要处理服务器交互的任何插件.只需查看backplug.io,Google和Github即可.

特别是对于Sockets,有backbone.iobind.

找不到插件,不用担心.我可以准确地告诉你如何写一个(它比声音容易100倍).

您需要了解的第一件事是覆盖行为非常容易.主要有两种方式:

全球:

Backbone.Collection.prototype.sync = function() { 
   //screw you Backbone!!! You're completely useless I am doing my own thing 
}
Run Code Online (Sandbox Code Playgroud)

每个实例

var MySpecialCollection = Backbone.Collection.extend({
    sync: function() { 
       //I like what you're doing with the ajax thing... Clever clever ;)
       // But for a few collections I wanna do it my way. That cool?
});
Run Code Online (Sandbox Code Playgroud)

而你唯一需要知道的是当你在集合上调用"fetch"时会发生什么.这是"按书"/"开箱即用行为"的行为:

  1. collection#fetch由用户(你)触发.fetch将委托ACTUAL获取(ajax,套接字,本地存储,甚至是立即返回json的函数)到其他函数(collection#sync).无论函数是什么collection.sync,都必须采用3个参数:
    1. action :( create用于创建),action :( read用于获取),delete(用于删除)或 update(用于更新)= CRUD.
    2. context(这个变量) - 如果你不知道它是做什么的,不要担心它,现在不重要
    3. 选项 - da magic的地方.我们只关心1个选项
      • success:在数据"准备就绪"时调用的回调.这是collection#fetch对它感兴趣的回调,因为那是它接管的时候并且是它的事情.唯一的要求是sync传递以下第一个参数
      • response:它回来的实际数据
    4. 现在必须在它完成获取数据时执行的选项中返回成功回调.它的功能是它的功能
  2. 每当collection#sync完成它的事情,collection#fetch收回(将回调传递给成功)并执行以下漂亮的步骤:
    1. 电话setreset(为了这些目的,它们大致相同).
    2. set结束时,会触发sync该集合广播到世界事件"哟,我已经准备好了!"
  3. 那么会发生什么set.很多东西(重复数据删除,解析,排序,解析,删除,创建模型,传播更改和一般维护).别担心.它有效;)你需要担心的是你如何能够进入这个过程的不同部分.你应该担心的唯一两个(如果你用奇怪的方式包装数据)
    1. collection#parse用于解析集合.应该接受来自server/ajax/websocket/function/worker/whoknowwhat的原始JSON(或任何格式)并将其转换为对象的ARRAY.接受第一个参数resp(JSON)并且应该为返回吐出一个变异的响应.十分简单.
    2. model#parse.与集合相同,但它接收原始对象(即想象您迭代输出collection#parse)并拆分"未包装"对象.
  4. 下车,去海滩,因为你完成工作的时间是你认为需要的时间的1/100.

这就是您需要知道的所有内容,以实现您想要的任何服务器系统来代替vanilla"ajax请求".