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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
javascript 数组排序函数
Aug 20 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
Aug 14 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
关于HTML5的data-*自定义属性的总结
May 05 Javascript
如何把vuejs打包出来的文件整合到springboot里
Jul 26 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
Dec 11 Javascript
详解关于微信setData回调函数中的坑
Feb 18 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
JavaScript实现页面高亮操作提示和蒙板
Jan 04 Javascript
简单了解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 年龄计算函数(精确到天)
2012/06/07 PHP
深入php数据采集的详解
2013/06/02 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
再谈javascript原型继承
2014/11/10 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
利用Python破解验证码实例详解
2016/12/08 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
如何理解Python中包的引入
2020/05/29 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
群众路线自我剖析范文
2014/11/04 职场文书
面试通知短信
2015/04/20 职场文书
同意报考公务员证明
2015/06/17 职场文书
2015年科普工作总结
2015/07/23 职场文书
婚宴来宾致辞
2015/07/28 职场文书
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers