bone.js的目的是什么?


441

我试图从它的站点http://documentcloud.github.com/backbone理解belish.js的实用程序,但是我仍然不太清楚。

有人可以通过解释它的工作原理以及对编写更好的JavaScript有什么帮助来帮助我吗?


36
这是一个MVC框架。它鼓励您将数据抽象到模型中,将DOM操作抽象到视图中,并使用事件将两者绑定在一起。
雷诺斯2011年

在MVC上下文中,“视图”如何处理事件?这就是骨架js.org在其介绍中所声称的。

3
值得学习。我在开始时遇到了一些困难,但是在学习曲线上克服了一些困难之后,这实际上并不太难。从酒窖演示开始。
kmitchel46725

2
在Backbone的上下文中,视图种类可以兼作控制器。它侦听DOM事件,并根据需要将其丢弃到模型中。它还侦听对模型和集合的更改,并适当地重绘DOM。骨干是MV模式,但隐含C。如果Backbone是Rails,则模板将是视图,而该视图将是控制器。
superluminary 2014年

我认为这是MVVM框架,因为它实际上不提供控制器。
SoluableNonagon

Answers:


393

Backbone.js基本上是一个超轻型框架,可让您以MVC(模型,视图,控制器)的方式构造Javascript代码,其中...

模型是您的代码的一部分,该代码用于检索和填充数据,

View是此模型的HTML表示(视图随模型的变化而变化,等等)

以及可选的Controller(在这种情况下,该Controller允许您通过hashbang URL)保存Javascript应用程序的状态,例如:http : //twitter.com/#search? q=backbone.js

我在Backbone上发现的一些优点:

  • 不再使用Javascript Spaghetti:将代码组织起来并分解为语义上有意义的.js文件,然后再使用JAMMIT进行组合

  • 没有更多的jQuery.data(bla, bla):没有必要在DOM存储数据,在型号代替使用存储数据

  • 事件绑定就可以了

  • 极其有用的Underscore实用程序库

  • ribs.js代码有据可查,并且很不错。使我对许多JS代码技术大开眼界。

缺点:

  • 花了我一些时间来解决这个问题,并弄清楚如何将其应用于我的代码,但是我是Java语言的新手。

这是一组有关将Backbone与Rails用作后端的很棒的教程:

CloudEdit:带有Rails的Backbone.js教程:

http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/

http://www.jamesyu.org/2011/02/09/backbone.js-tutorial-with-rails-part-2/

ps还有一个很棒的Collection类,可让您处理模型的集合并模仿嵌套模型,但是我不想从一开始就使您感到困惑。



16
这个答案是错误的。骨干网不是MVC框架。它是MV *框架。了解主要组成部分很重要。而且它没有控制器。祝好运。

3
重申一下,Backbone库本身没有控制器,尽管Jeremy Ashkenas曾说过View对象会取代它们,因为它们是JavaScript对象,它们拥有模型并在前端和后端进行数据混排。当然,没有什么可以阻止您实现Controller,Service甚至是ViewModel(如果您愿意),它只是JavaScript。
superluminary 2014年

3
什么是JAMMIT? ɯnɯıuıɯ ʇunoɔ ɹǝʇɔɐɹɐɥɔ
user1717828 2014年

1
RE:“ jQuery.data(bla,bla):无需在DOM中存储数据” IIRC,jQuery仍将其存储在内存中。即,它不会将data-属性设置回DOM元素。(因此,如果您的HTML data-在页面加载时具有属性,并且对其进行了更改,则DOM和内存表示形式将是OOS-但无论如何您都应该使用内存数据)
JoeBrockhaus

250

如果要在浏览器中构建复杂的用户界面,那么您可能会发现自己最终发明了构成Backbone.js和Sammy.js之类的框架的大部分组件。因此,问题是,您是否在浏览器中构建了足够复杂的东西以值得使用它(因此您最终不会自己发明相同的东西)。

如果您打算构建的内容是UI会定期更改其显示方式,但不会去服务器获取整个新页面的方式那么您可能需要Backbone.js或Sammy.js之类的东西。谷歌的GMail就是这样的主要例子。如果您曾经使用过它,您会注意到,当您第一次登录时,它会下载一大块HTML,CSS和JavaScript,然后所有事情都会在后台发生。它可以在阅读电子邮件和处理收件箱以及再次搜索并遍历所有收件箱之间切换,而无需请求呈现整个新页面。

这些框架擅长使这类应用易于开发。没有它们,您要么将各种单独的库组合在一起以获得部分功能(例如,用于历史记录管理的jQuery BBQ,用于事件的Events.js等),要么最终自己构建所有东西并且还必须自己维护和测试所有内容。与此形成鲜明对比的是,Backbone.js之类的东西在Github上有成千上万的人在观看它,人们可能正在使用它的数百个Fork,在Stack Overflow上已经有数百个问题已经问及回答了。

但是,如果您计划构建的内容不够复杂而不值得与框架相关的学习曲线,那么这一切都不重要。如果您仍在构建PHP,Java或其他网站,后端服务器仍在按照用户的要求来构建网页,而JavaScript / jQuery只是在该过程中锦上添花,不需要或尚未准备使用Backbone.js。


21
感谢您与Gmail进行比较。对于我来说,这是一种简便的方法,可以确定我不需要为正在开发的网站进一步研究。
埃里克·胡

15
+1提的是,你会放弃以前的撰写类似Backbone.js的自己,如果你的项目变得足够大:重新格林斯潘的第10条
马修锁定

如果您使用PHP或类似的东西作为Web服务的终结点,则说明您未使用80%或90%的传统请求/响应样式的Web开发框架。因此,与传统的Web应用程序相比,这种应用程序最终的构建方式有很大的不同。
约翰·蒙施

2
谢谢约翰的回答,它的确具有启发性
sushil bharwani

1
Gmail参考确实让我大开眼界。谢谢!
T.Kaukoranta

95

骨干是...

...一个很小的组件库,可用于帮助组织代码。它打包为一个JavaScript文件。除注释外,它的实际JavaScript少于1000行。它写得很明智,您可以在几个小时内阅读全部内容。

这是一个前端库,您可以在脚本中将其包含在网页中。它只会影响浏览器,对服务器的影响很小,只是理想情况下应该公开一个宁静的API。

如果您有API,则Backbone具有一些有用的功能,可以帮助您与之交谈,但是您可以使用Backbone向任何静态HTML页面添加交互性。

骨干是...

...将结构添加到JavaScript。

因为JavaScript不强制执行任何特定的模式,所以JavaScript应用程序很快就会变得非常混乱。任何在JavaScript中构建过琐碎事物的人都可能遇到以下问题:

  1. 我将数据存储在哪里?
  2. 我将功能放在哪里?
  3. 我将如何将我的功能连接在一起,以便以一种明智的方式调用它们,而不会变成意大利面条?
  4. 如何使此代码可由其他开发人员维护?

Backbone试图通过给您以下问题来回答这些问题:

  • 模型和集合可帮助您表示数据和数据集合。
  • 视图,以帮助您在数据更改时更新DOM。
  • 一个事件系统,使组件可以相互侦听。这样可以使您的组件保持解耦,并防止意大利面条化。
  • 最少的明智约定,因此开发人员可以在同一代码库上一起工作。

我们称其为MV *模式。型号,视图和可选附加件。

骨干很轻

尽管最初出现了,但是Backbone的重量却非常轻,几乎没有任何作用。它所做的工作非常有帮助。

它为您提供了一组可以创建的小对象,这些小对象可以发出事件并相互监听。例如,您可以创建一个小对象来表示评论,然后创建一个小commentView对象来表示评论在浏览器中特定位置的显示。

您可以告诉commentView收听评论,并在评论更改时重绘自身。即使您在页面的多个位置显示了相同的注释,所有这些视图也可以收听相同的注释模型并保持同步。

即使您的代码库在很多交互作用下变得很大,这种方式的代码编写方法也有助于避免纠结。

楷模

开始时,通常将数据存储在全局变量中或作为数据属性存储在DOM中。这两个都有问题。全局变量可以相互冲突,并且通常是错误的形式。存储在DOM中的数据属性只能是字符串,您将不得不对其进行解析。存储诸如数组,日期或对象之类的东西,并以结构化形式解析数据非常困难。

数据属性如下所示:

<p data-username="derek" data-age="42"></p>

Backbone通过提供一个Model对象来表示您的数据和相关方法来解决此问题。假设您有一个待办事项列表,那么您将有一个模型来代表该列表中的每个项目。

更新模型后,它将触发一个事件。您可能具有与该特定对象关联的视图。该视图侦听模型更改事件并重新渲染自身。

观看次数

骨干网为您提供了与DOM对话的View对象。所有操作DOM或侦听DOM事件的函数都在这里。

视图通常实现一个渲染功能,该功能可以重绘整个视图或视图的一部分。没有义务实现渲染功能,但这是一个通用约定。

每个视图都绑定到DOM的特定部分,因此您可能有一个searchFormView(仅侦听搜索表单)和shoppingCartView(仅显示购物车)。

视图通常还绑定到特定的模型或集合。当模型更新时,它将触发视图侦听的事件。他们可能会调用该视图来重绘自身。

同样,当您键入表单时,您的视图可以更新模型对象。然后,每个其他监听该模型的视图都将调用其自己的渲染函数。

这使我们可以清晰地分离关注点,从而使我们的代码保持整洁。

渲染功能

您可以按照自己认为合适的任何方式实现渲染功能。您可能只是将一些jQuery放在此处以手动更新DOM。

您也可以编译模板并使用它。模板只是带有插入点的字符串。您将其与JSON对象一起传递给编译函数,然后获取可以插入到DOM中的已编译字符串。

馆藏

您还可以访问存储模型列表的集合,因此todoCollection将是todo模型的列表。当某个集合获得或失去模型,更改其顺序或更新集合中的模型时,整个集合都会触发一个事件。

视图可以侦听集合并在集合更新时自动更新。

您可以向集合中添加排序和过滤方法,例如使其自动排序。

和将一切联系在一起的活动

应用程序组件应尽可能彼此分离。它们使用事件进行通信,因此shoppingCartView可能会侦听shoppingCart集合,并在添加购物车时重新绘制自身。

shoppingCartView.listenTo(shoppingCart, "add", shoppingCartView.render);

当然,其他对象也可能也在监听购物车,并且可能会执行其他操作,例如更新总计或将状态保存在本地存储中。

  • 视图会监听模型,并在模型更改时进行渲染。
  • 当集合中的项发生更改时,视图会侦听集合并呈现列表(或网格,地图等)。
  • 模型会监听视图,因此它们可以更改状态,也许是在编辑表单时。

这样将对象解耦并使用事件进行通信意味着您永远不会纠结,添加新组件和行为也很容易。您的新组件只需要侦听系统中已经存在的其他对象。

约定

为Backbone编写的代码遵循一组宽松的约定。DOM代码属于视图。集合代码属于集合。业务逻辑进入模型。另一位使用您的代码库的开发人员将能够开始工作。

总结一下

Backbone是一个轻量级的库,可为您的代码提供结构。组件是分离的,并通过事件进行通信,因此您不会陷入混乱。您可以轻松地扩展代码库,只需创建一个新对象并使其适当地侦听现有对象即可。您的代码将更加简洁,美观和可维护。

我的小书

我非常喜欢Backbone,以至于我写了一些介绍性的书。您可以在此处在线阅读:http//nicholasjohnson.com/backbone-book/

我还将资料分解为一个简短的在线课程,您可以在这里找到:http : //www.forwardadvance.com/course/backbone。您可以在大约一天的时间内完成课程。


1
View不会从技术上呈现模板,而不是实际上是“自身”吗?它似乎更多地扮演“ Presenter”或“ ViewModel”角色。
JoeBrockhaus

1
好点,尽管视图可以呈现您要求的任何内容。这可能是模板,一些任意的jQuery,甚至是一些很小的东西,例如表单中的值或徽章中的数字。
superluminary 2015年

3
@superluminary真的有帮助!!
Antoops 2015年

2
很棒的解释!
DeliciousCode 2015年

3
这本书非常有帮助。谢谢你写
宋祖

32

这是一个有趣的演示:

Backbone.js简介

提示(来自幻灯片):

  • 浏览器中的Rails?没有
  • 一个用于JavaScript的MVC框架?Sorta
  • 一个大胖子状态机?是的

14

Backbone.js是一个JavaScript框架,可帮助您组织代码。从字面上看,它是构建应用程序的基础。它不提供小部件(如jQuery UI或Dojo)。

它为您提供了一组很酷的基类,您可以扩展这些基类来创建干净的JavaScript代码,这些代码与服务器上的RESTful端点进行接口。


我在项目中大量使用jQuery,mootools和常规javascript。请问learning.js会对我有什么帮助,什么是Restful终结点。
sushil bharwani 2011年

1
jQuery主要用于DOM操作,因为Backbone被大量用作事件驱动框架以及用于数据建模。
RobertPitt 2011年

14

JQuery和Mootools只是一个包含大量项目工具的工具箱。骨干网就像项目的架构或骨干网一样,您可以使用JQuery或Mootools在其上构建应用程序。


是的,实际上,很容易假设该名称只是一个名称,例如'jquery'可能意味着'javascript query'本身并不意味着太多。但在这种情况下,它的字面意思是骨干:)
msanjay 2013年

11

这是一个非常不错的入门视频:http : //vimeo.com/22685608

如果您正在寻找有关Rails和Backbone的更多信息,那么Thoughtbot拥有这本不错的书(不是免费的):https ://workshops.thoughtbot.com/backbone-js-on-rails


11

我必须承认,MVC的所有“优势”从来没有使我的工作变得更轻松,更快或更好。它只是使整个编码体验变得更加抽象和耗时。当尝试调试别人对分离意味着什么的概念时,维护是一场噩梦。不知道你们中有多少人曾经尝试更新使用Cairngorm作为MVC模型的FLEX站点,但是需要30秒才能完成的更新通常会花费2多个小时(仅为了查找单个事件而进行的狩猎/跟踪/调试) )。对我来说,MVC过去是,现在仍然是可以填充的“优点”。


2
老实说,任何无知的程序员或不关心的程序员都可以破坏和变形任何框架结构。我曾经在一个CodeIgniter网站上工作,该网站本来应该非常简单直接。但是与我一起工作的白痴习惯了90年代的工作方式,因此将其从干净的OOP方法更改为OOP内的变形程序方法。
帕特里克

9
我还看到有人从头开始编写一个网站,并且在不使用任何框架的情况下编写精美的网站。有一次,这是由一个相对较新/绿色的PHP程序员完成的。他只是碰巧有一个非常理性的头脑,想出了一种巧妙的方法来实现事情。使用一个好的框架只会使您步入正轨。而使用出色的编程实践将带您光明的未来。
帕特里克

2
@ user1415445:您所说的本质上意味着,与由单独的类/对象处理每个问题相比,拥有一个处理数据逻辑,渲染逻辑以及表示层小部件与数据存储/检索代码之间的通信的单一类更容易维护。很难相信。除非你能证明一个不平凡的应用与MVC写两次,一次,一次不带,其非MVC的版本更容易维护,等等
Behrang Saeedzadeh

1
理想情况下,任何超出普通水平的应用程序都需要模式,而MVC是处理数据表示时的绝佳模式。听起来您的经历很糟糕,但这不是模式的错误。
superluminary

无论使用哪种模式和实践,文档始终是缺少的罗塞塔石碑,因为随着时间的推移,这些会发生变化。MVC之类的模式的优点在于,一旦您了解了管道,就不必在每次添加新功能或更新旧功能时都浪费时间来编写管道。因此,是的,除非您了解管道,否则将是徒劳的。确保对未来未知开发者有充分了解的唯一方法是遵循足够合理的标准,并且还要记录良好。维护和理解某人的无所事事的混乱并没有变得更快或更容易
。.– JoeBrockhaus


3

骨架.js是具有JavaScript的模型视图控制器(MVC),Extjs优于Java脚本编写的MVC模式的骨架

有了骨干,您几乎可以自由做任何您想做的事情。与其尝试遍历api和自定义,不如使用Backbonejs,因为它简单易行。再说一遍,很难说您需要的是一个库还是另一个组件


3

骨干网由Jeremy Ashkenas创建,他还撰写了CoffeeScript。作为一个包含大量JavaScript的应用程序,我们现在称为Backbone负责将应用程序结构化为一个统一的代码库。Underscore.js(骨干唯一的依赖项)也是DocumentCloud应用程序的一部分。

Backbone帮助开发人员以与传统服务器端应用程序逻辑相同的纪律结构来管理其客户端Web应用程序中的数据模型。

使用Backbone.js的其他好处

  1. 将Backbone视为库而不是框架
  2. 现在正在以结构化的方式组织Javascript (MVVM)模型
  3. 大型用户社区

2

它还使用控制器和KVO视图添加路由。您将能够使用它开发“ AJAXy”应用程序。

将其视为轻量级的Sproutcore或Cappuccino框架。


1

相信我,这是客户端上的MVC设计模式。它将为您节省大量代码,更不用说更简洁明了的代码,更易于维护的代码了。起初可能有些棘手,但请相信我,它是一个很棒的图书馆。


0

已经有很多好的答案。Backbone js有助于保持代码井井有条。更改模型/集合会照顾到视图呈现的自动性,从而减少了很多开发开销。

即使它为开发提供了最大的灵活性,开发人员也应小心破坏模型并正确删除视图。否则,应用程序中可能会发生内存泄漏。


-3

一个涉及许多用户与许多AJAX请求的交互的Web应用程序,该Web应用程序需要不时更改,并且要实时运行(例如Facebook或StackOverflow),应该使用MVC框架(例如Backbone.js)。这是构建良好代码的最佳方法。

如果应用程序很小,那么Backbone.js会显得过大,特别是对于初次使用的用户。

Backbone为您提供了客户端MVC,以及由此带来的所有优势。


5
“必须”使用骨干网吗?我完全看不到使用骨干或下划线的stackoverflow或facebook,这两个例子。您对此主张有参考吗?
大卫·梅斯特

当然,还有许多其他MV *库,其中Backbone就是其中之一。通常,MVC在开发较大的代码段时有助于使事情保持整洁。
superluminary 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.