您的开场白实际上很好地说明了 Backbone.js 和 jQuery 之间的差异,所以让我们稍微解压一下。
一方面,这两个库根本没有竞争——它们是互补的。
举个例子,下面是我会用 jQuery 做的一些事情:
- 动画幻灯片
- 表单控件增强功能,例如 iOS 风格的数字“微调器”
- 根据类名切换元素的可见性
还有一些我可能在 Backbone.js 中做的事情:
- 创建一个相册,用户可以在其中单击缩略图并查看照片的放大版本,以及一些数据,例如使用的相机、位置和摄影师的姓名
- 构建一个主/详细信息类型的页面,显示数据网格并允许用户单击单个元素并在表单中更新它们。
jQuery 擅长于微观层面——选择页面元素,消除浏览器处理事件的差异。
Backbone.js 更具全局性。它可以帮助您管理数据和应用程序逻辑。在上面的相册示例中,Backbone 提供了几个有用的结构:您需要包含与照片相关的所有数据(模型)、相册中所有照片的列表(集合)以及放置位置确定当用户单击缩略图(视图)时会发生什么的逻辑。这些是 Backbone 控件或应用程序中的主要部分。
Backbone.js 受益于 jQuery 或类似的东西,以帮助将应用程序的数据和逻辑结果呈现到 DOM 中。例如,通常使用 jQuery 选择页面上将用作 Backbone 应用程序容器的元素。使用 jQuery 的 $(function () {}); 来启动 Backbone 控件的各个部分也很常见。您可能还会使用 jQuery 显示表单字段验证错误消息。
您当然可以在 jQuery 中构建大而复杂的用户界面。我在工作中维护的应用程序中有一些。但是它们很难使用,因为 jQuery 的设计目的不是为应用程序提供结构。特别是 jQuery 的 API,它基于选择项目组,然后传递操作这些项目的回调函数,在大型、复杂的控件或应用程序中使用不是一个好的模式。你最终会得到很多嵌套函数,很难看到发生了什么。
我目前正在修改 Backbone.js 中的其中一个控件。作为最后一个示例,这里快速总结一下在两个不同库中处理相同控件时我的思维过程有何不同。
在jQuery中,我很担心:
- 我是否使用正确的选择器来获取我想要的
li 元素组?
- 当此 Ajax 调用完成时,我是否需要重新填充该值列表?
- 如何将这些数组值放回页面上的
input 元素中?
在 Backbone 中,我更专注于:
- 在我的模型项上验证这组属性的正确逻辑是什么?
- 当用户单击“添加”按钮时,我应该立即将新项目添加到集合中,还是应该等到他们填写完所有数据并且它“有效”?
- 当我的集合中的项目被删除之前或之后,它应该如何响应?
jQuery 处理细节,Backbone 更高级。
最后,请注意我在讨论 Backbone.js 示例时一直使用“控制”和“应用程序”这两个词。 Backbone.js 仅适用于单页应用程序是不正确的。不过,Backbone.js 确实适用于构建复杂的应用程序来操作数据和处理大量逻辑。将它用于小规模 UI 元素会很愚蠢——不需要它强加的额外结构。
更新:在多页问题上,是的,Backbone 确实提供了一种强大的机制来持久化您的数据。每个模型都有一个 save 方法,该方法将执行 AJAX 调用以将更改存储在服务器上。因此,只要您随时保存数据,您就可以拥有一个多页应用程序。这是一个非常灵活的模型,这就是我们最终可能会在工作中使用 Backbone 的方式。虽然我很想构建一个单页应用程序,但我们在现有的多页应用程序上已经工作了 10 年。我们希望在 Backbone 中重建一些更强大的 UI 组件,然后在用户移动到不同页面之前将更改同步到服务器。