Backbone.js和jQuery
据说Backbone处理所有更高级别的抽象,而jQuery或类似的库与DOM协同工作,规范事件等等。
有人能帮助我用一个简单的实例来理解这个陈述吗?
另外像Backbone,Knockout这样的MVC框架的一个重要特性是它保持模型(数据)和视图同步。 但是这似乎是在页面级而不是在整个应用程序中。 所以我们可以有模型/数据和视图在多个页面同步..(种类的全球)
Backbone / Knockout通常用于单页面应用程序。 所以,尽pipejQuery是一个可以在任何网页上使用的工具箱,但是Backbone是针对特定types的应用程序,并帮助您组织代码。 至less根据我的经验,构build单页应用程序最大的挑战之一是保持代码的清洁和模块化,而主干则可以帮助您做到这一点。
一个典型的骨干应用程序的特点是:
- 本质上是静态的HTML页面,没有在服务器上生成任何东西
- 服务器充当一个JSON REST API,为应用程序提供内容
- 显示数据的dom元素是用javascript在骨干视图中创build的,使用jQuery和各种模板库来提供帮助
- 与服务器以及应用程序的不同部分之间的通信通过骨干模型完成
关于保持数据在多个页面上同步的问题,我本能的答案是,你不需要多个页面:用户可能会感觉到页面正在改变,url栏中的地址由于pushStatefunction而改变,但从技术上讲,整个应用程序是一个页面。
这种方法的最大优点是平滑的用户体验(无需重新加载页面),除了json数据之外的所有内容都是静态内容,对于移动目标来说,可以将web应用程序转换为具有phoneGap的移动应用程序(因为除json之外的所有东西都是静态的)
您的开头语句实际上是Backbone.js和jQuery之间差异的一个非常好的声明,所以让我们解压一下。
首先,这两个图书馆根本就不是竞争对手 – 它们是免费的。
作为一个例子,下面是我会用jQuery做的一些事情:
- animation幻灯片
- 表单控件增强function,如iOS风格的数字“微调”
- 基于类名切换元素的可见性
还有一些我可能在Backbone.js中做的事情:
- 创build一个相册,用户点击一个缩略图,可以查看更大的照片,以及一些数据,如使用的相机,位置和摄影师的名字
- 构build呈现数据网格的主页/详细信息types的页面,并允许用户单击各个元素并将其更新为表单。
jQuery擅长微观层面 – select页面元素,平滑浏览器处理事件的差异。
Backbone.js是更大的图片。 它可以帮助您pipe理数据和应用程序逻辑。 在上面的相册示例中,Backbone提供了一些有用的结构:您可以包含与照片(模型)相关的所有数据,相册中的所有照片的列表(集合),以及放置确定当用户点击缩略图(视图)时会发生什么的逻辑。 这些是主干控制或应用程序中的主要部分。
Backbone.js可以从jQuery中受益,或者类似的东西,来帮助将应用程序的数据和逻辑结果呈现到DOM中。 例如,通常使用jQuery来select页面上的元素,作为Backbone应用程序的容器。 使用jQuery的$(function () {});
也很常见$(function () {});
激发您的Backbone控件。 你可能也会用jQuery显示表单字段validation错误信息。
您当然可以在jQuery中构build大而复杂的用户界面。 我在工作中维护的应用程序中有一些。 但是他们很难合作,因为jQuery不是为应用程序提供结构的。 特别是,jQuery的API基于围绕select项目组,然后传递处理这些项目的callback函数,并不是在大型,复杂的控件或应用程序中使用的好模式。 你最终得到很多嵌套的函数,很难看到发生了什么。
我目前正在对Backbone.js中的那些控件进行重新devise。 作为最后一个例子,下面简要总结一下在不同的库中使用同一个控件时,我的思维过程是如何不同的。
在jQuery中,我很担心:
- 我是否使用正确的select器来抓取我想要的元素组?
- 当这个Ajax调用完成时,是否需要重新填充这个值列表?
- 我怎样才能把这些数组值返回到页面上的
input
元素?
在骨干,我更关注于:
- 在我的模型项目上validation这组属性的正确逻辑是什么?
- 当用户点击添加button,我应该立即添加一个新的项目集合,或者我应该等到他们填写了所有的数据,它是“有效的”?
- 在collections物品被删除之前或之后,collections品中的物品应该如何回应?
jQuery处理细节的细节,Backbone更高级。
最后,请注意,在讨论Backbone.js示例时,我一直使用“control”和“app”两个词。 Backbone.js不适用于单页面应用程序。 不过,Backbone.js确实适用于构build操作数据和处理大量逻辑的复杂应用程序。 将它用于小规模的UI元素将是愚蠢的 – 它所施加的额外结构是不需要的。
更新:关于多个页面的问题,是的,Backbone确实提供了一个强大的机制来保存你的数据。 每个模型都有一个save
方法,它将执行一个AJAX调用以将更改存储在服务器上。 所以只要你保存你的数据,你可以有一个多页面的应用程序。 这是一个非常灵活的模式,这就是我们最终可能在工作中使用Backbone的原因。 虽然我很想构build一个单页面的应用程序,但我们在现有的多页面应用程序中已经工作了10年。 我们正在重buildBackbone中一些更加激烈的UI组件,然后在用户移动到不同的页面之前将更改同步到服务器。
我从来没有听说过在多个页面上使用backbone.js的人。 这几乎总是一种单一页面的应用程序。
单个页面可能有许多不同的模型,视图和状态,可能会导致一个完整的,function强大的应用程序。
如果你已经在java中有服务器端的模板/视图渲染,那么backbone.js不适合你。 要充分利用backbone.js,您必须移动或复制前端JavaScript中的部分代码。
如果你不想做一个单一的页面应用程序(这只是一个没有页面刷新或更改的应用程序,但url仍然可以改变,可以看起来像多页给用户),那么你可以保持所有的MVC服务器,你不需要主干。
编辑:
什么主干是移动一些通常在服务器上处理的MVC的东西,并将其移动到客户端。 对于很多人来说,这意味着忘记服务器,只需将您的应用程序编写为单页JavaScript应用程序即可。 服务器成为JSON / REST数据的来源。 如果你不准备这样做,那么backbone.js就没有那么有用了。
Backbone是一个MV *框架,而jQuery是一个DOM工具箱。
MV *应用程序的主要function是路由,数据绑定,模板/视图,模型和数据访问。 骨干可以部分依赖于jQuery。
jQuery是一个坚实的API,可以通过广泛的浏览器支持和充满活力的社区来查询DOM。 它带有事件处理,延迟对象和animation。
简单的事件绑定使用jQuery
// When any <p> tag is clicked, we expect to see '<p> was clicked' in the console. $( "p" ).on( "click", function() { console.log( "<p> was clicked" ); });