JavaScript的Backbone.js框架的一些使用建议整理


Posted in Javascript onFebruary 14, 2016

Backbone 为复杂Javascript应用程序提供模型(models)、集合(collections)、视图(views)的结构。其中模型用于绑定键值数据和自定义事件;集合附有可枚举函数的丰富API; 视图可以声明事件处理函数,并通过RESTful JSON接口连接到应用程序。
当我们开发含有大量Javascript的web应用程序时,首先你需要做的事情之一便是停止向DOM对象附加数据。 通过复杂多变的jQuery选择符和回调函数创建Javascript应用程序,包括在HTML UI,Javascript逻辑和数据之间保持同步,都不复杂。 但对付客户端应用来说,良好的架构通常是有很多益处的。
Backbone将数据呈现为模型, 你可以创建模型、对模型进行验证和销毁,甚至将它保存到服务器。 当UI的变化引起模型属性改变时,模型会触发"change"事件; 所有显示模型数据的视图会接收到该事件的通知,继而视图重新渲染。 你无需查找DOM来搜索指定id的元素去手动更新HTML。 —旦模型改变了,视图便会自动变化。
backbone.js提供了一套web开发的框架,通过Models进行key-value绑定及custom事件处理,通过Collections提供一套丰富的API用于枚举功能,通过Views来进行事件处理及与现有的Application通过RESTful JSON接口进行交互.它是基于jquery和underscore的一个js框架。

Backbone天生就不固执己见。你从文档上获取的一个最基本观点是:使用backbone.js提供的工具,做任何你想做的事。

这点非常好,因为有这么多不同的应用场合,而且对于开始写app来说也非常容易。这种途径可能避免我们在刚开始时犯尽可能少的错误。

当一件事做错的时错,我们要发现并找到改正的方法。

下面这些提示,可以让你避免我们在进行Backbone.js开发时所碰到错误:

1. 视图(Views)是数据无关的(Data-Less)

数据属于模型(models)不是视图。下次你发现 你在一个视图中存储数据(或者更糟:在DOM里),马上把它移到model里。

如果你没有model,创建一个非常简单:

this.viewState = new Backbone.Model();

真的不需要任何其它操作。

你可以在你的数据上侦听改变事件,甚至跟你的服务器在线同步。

2. DOM事件只改变models

当一个DOM事件触发时,比如点击了一个按钮,不要让它改变view本身。改变这个model.

改变DOM且不改变状态意味着你的状态还存储在DOM中。这条规则可以让你保持状态一致。

如果点击了一个“加载更多”边接,不要展开视图,只需要改变model:

this.viewState.set('readMore', true);

好了,但是视图何时发生改变?好问题,下一条规则会回答。

3.DOM只有在model发生改变时才改变

事件是很神奇的,请使用他们。最简单的方法是每次改变后触发一遍。

this.listenTo(this.stateModel, 'change', this.render);

更好的方法是只有在需要的时侯触发改变。

this.listenTo(this.stateModel, 'change:readMore', this.renderReadMore);

这个视图会一直同他的model保持一致。无论model是如何改变的:从命令接口或调试信息处响应动作,这个视图会一直保持更新。

4. 绑定的东西必须解绑

当视图从DOM上移除时,使用'remove'方法,它必须从所有绑定的事件上解绑上。

如果你使用'on'绑定,你的职责是使用'off'去解绑。如果没有解绑,内存回收器无法释放内存,从而造成你应用的性能下降。

这就是'listenTo'的由来。它会跟踪视图的绑定和解绑。Backbone把这个从DOM移动之前,会进行'stopListening'。

// Ok:
this.stateModel.on('change:readMore', this.renderReadMore, this);
 
// 神奇:
this.listenTo(this.stateModel, 'change:readMore', this.renderReadMore);

5. 保持链式写法

从render和remove方法里,总是返回'this'。这样可以让你写方法链。

view.render().$el.appendTo(otherElement);

这很方法,不要打破它。

6. 事件比回调要好

等待响应事件比回调要好

Backbone模型(models)默认会触发'sync'和'error'事件,因此可以使用这些事件代替回调。考虑一下这两种情况。

model.fetch({
 success: handleSuccess,
 error: handleError
});
//这种更好:
view.listenTo(model, 'sync', handleSuccess);
view.listenTo(model, 'error', handleError);
model.fetch();

model何时填充(fetched)并不重要,handleSucess/handleError会被调用。

7. Views是有作用域的

视图永远不要操作除了它本身以外的DOM。

view会引用它自己的DOM元素,如'el'或者jquery对象'$el'

那意味着你永远不要直接使用jQuery:

$('.text').html('Thank you');

请把DOM元素的选择限定到你自己的域里面:

this.$('.text').html('Thank you');
 
// 这等价于
// this.$el.find('.text').html('Thank you');

如果你需要更新一个别的不同的视图,只要触发一个事件,让别的视图去做。你也可以使用Backbone的全局Pub/Sub系统。

例如,我们阻止页面滚动:

var BodyView = Backbone.View.extend({
 initialize: function() {
  this.listenTo(Backbone, 'prevent-scroll', this.preventScroll);
 },
 
 preventScroll: function(prevent) {
  // .prevent-scroll 有下面的CSS规则: overflow: hidden;
  this.$el.toggleClass('prevent-scroll', prevent);
 }
});
 
// 现在从任何其他地方调用:
Backbone.trigger('prevent-scroll', true);  // 阻止 scrolling
Backbone.trigger('prevent-scroll', false); // 允许 scrolling

还有一件事

只要读读backbone的源代码,你会学到更多。看一看backbone.js的源代码,然后看看这些神奇的事情是怎么实现的。这个库非常小,而且可读性很好,整个读完不会超过10分钟的。

这些小贴士帮助我们写干净的,更好的可读的代码。

Javascript 相关文章推荐
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
Apr 12 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
Apr 30 Javascript
基于jquery库的tab新形式使用
Nov 16 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
jQuery代码性能优化的10种方法
Jun 21 Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
Dec 13 Javascript
微信小程序-滚动消息通知的实例代码
Aug 03 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
Aug 25 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
Sep 30 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
简单了解Backbone.js的Model模型以及View视图的源码
Feb 14 #Javascript
Backbone.js框架中简单的View视图编写学习笔记
Feb 14 #Javascript
10个JavaScript中易犯小错误
Feb 14 #Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
Feb 14 #Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 #Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 #Javascript
jQuery插件支持同一页面被多次调用
Feb 14 #Javascript
You might like
PHP中的switch语句的用法实例详解
2015/10/21 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
animate动画示例(泪奔的小孩)及stop和delay的使用
2013/05/06 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python实现word2Vec model过程解析
2019/12/16 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
给海归自荐信的建议
2013/12/13 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
离职证明标准格式
2014/09/15 职场文书
中学音乐课教学反思
2016/02/18 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书