backbone库学习-View
Backbone中的视图提供了一组处理DOM事件、和渲染模型(或集合)数据方法(在使用视图之前,你必须先导入jQuery或Zepto)
视图类提供的方法非常简单,我们一般在backbone.View的基础上进行扩展。但即使是特别复杂的视图类,它也应该仅仅是做界面事件、和渲染逻辑相关的操作,数据管理应该交由Model和Collection来完成,而业务逻辑应该由其它的类完成。
上述文字来自http://blog.csdn.net/eagle_110119/article/details/8842026
backbone框架图:http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html
1.1 定义和创建视图
先看例子1.1-1:
<div title="列表" style="color:red" id="list" class="listview"></div>
<script type="text/javascript">
var ListView = Backbone.View.extend({
el : '#list'
});
var listview = new ListView();
</script>
extend部分就不看,跟collection和model一样。
var ListView = Backbone.View.extend({
el : '#list'
});
将el绑定到ListView的原型上,通过ListView实例化的对象可以直接使用。
下一段代码:
var listview = new ListView();
看一下View的构造器:
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');//生成关于视图的cid
options || (options = {});
_.extend(this, _.pick(options, viewOptions));//将自定义属性值绑定到实例上
this._ensureElement();//调用_ensureElement方法
this.initialize.apply(this, arguments);//调用init方法
this.delegateEvents();//调用delegateEvents方法
}
先看一下underscore的pick方法
_.pick = function(obj) {
var copy = {};
var keys = concat.apply(ArrayProto, slice.call(arguments, 1));//转成数组
each(keys, function(key) {
if (key in obj) copy[key] = obj[key];//为copy绑定自定义的属性值,前提是属性名是viewOptions中的
});
return copy;
}
将自定义的信息绑定到this实例。
这里例子略显简单,导致源码很多部分不能覆盖执行,我们给例子添加点东西,再进入_ensureElement方法,看例子1.1-2
<script type="text/javascript">
var ListView = Backbone.View.extend({
tagName : 'div',
className : 'listview',
id : 'list',
attributes : {
title : '列表',
style : 'color:red'
},
render : function() {
this.el.innerHTML = 'Hello World!';
document.body.appendChild(this.el);
}
});
var listview = new ListView();
listview.render();
</script>
其中
{
tagName : 'div',
className : 'listview',
id : 'list',
attributes : {
title : '列表',
style : 'color:red'
}
将会被加到View的实例中。看一下_ensureElement方法
_ensureElement: function() {
if (!this.el) {//没有关联页面的标签,一般是创建在页面显示
var attrs = _.extend({}, _.result(this, 'attributes'));//将attributes的信息绑定到attrs上
if (this.id) attrs.id = _.result(this, 'id');//将id传给attrs。
if (this.className) attrs['class'] = _.result(this, 'className');//将className传给attrs
//至此attrs获取基本的创建标签的属性
var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);//调用第三方选择器生成标签,并注入我们自定义的属性信息,但这里还没有将该对象插入HTML页面
this.setElement($el, false);
} else {//声明的时候我们定义了el
this.setElement(_.result(this, 'el'), false);//调用进入setElement方法
}
}
backbone在View这块,依赖一些第三方插件,比如jQuery,Zepto等。所以使用的时候,先将它们加载进来。进入setElement方法。
setElement: function(element, delegate) {
if (this.$el) this.undelegateEvents();//初始化时,不执行
this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
//这里给定义,调用第三方的选择器生成dom对象(并非原生dom对象,这里我们引用的是jQuery,
// 就姑且认为是jQuery对象),将我们之前生成jQuery对象传给实例的$el属性
this.el = this.$el[0];//获得原生对象
if (delegate !== false) this.delegateEvents();
return this;
}
这个例子中,我们没有绑定任何事件。接着我们执行构造器中的最后一个方法delegateEvents
if (!(events || (events = _.result(this, 'events')))) return this;//没有代理事件,返回
因为没有绑定事件,这里就直接返回了。
例子中使用listview.render(),看一下render()
render: function() { //这个方法默认返回实例,使用时,可以将其重载
return this;
}
声明View类时,我们已经自定义了render,这将会重载系统中原有的render,那我们来看一下自定义的render
render : function() {
this.el.innerHTML = 'Hello World!';
document.body.appendChild(this.el);
}
this.el是生成jQuery对象转成的原生对象。在其中添加"Hello World",最后再将它插入页面,最后显示在页面上
这里我们总结下各个属性的作用,很简单
tagName标识新标签的名称(如果没有设置,则默认是div)
className对应标签的class样式
id对应标签的id属性
1.2 处理DOM事件
可以想一下,以往我们是怎么用jQuery绑定事件的
<p>
<input type="button" value="Create" id="create" />
<input type="button" value="Read" id="read" />
<input type="button" value="Update" id="update" />
<input type="button" value="Delete" id="delete" />
</p>
<script type="text/javascript">
function createData() {
// todo
}
function readData() {
// todo
}
function updateData() {
// todo
}
function deleteData() {
// todo
} $('#create').on('click', createData);
$('#read').on('click', readData);
$('#update').on('click', updateData);
$('#delete').on('click', deleteData);
</script>
那我们看一下backbone的view是如何处理dom事件的,先上个例子1.2-1
<p id="view">
<input type="button" value="Create" id="create" />
<input type="button" value="Read" id="read" />
<input type="button" value="Update" id="update" />
<input type="button" value="Delete" id="delete" />
</p>
<script type="text/javascript">
var MyView = Backbone.View.extend({
el : '#view',
events : {
'click #create' : 'createData',
'click #read' : 'readData',
'click #update' : 'updateData',
'click #delete' : 'deleteData'
},
createData : function() {
console.log('create');
},
readData : function() {
console.log('read');
},
updateData : function() {
console.log('update');
},
deleteData : function() {
console.log('delete');
}
});
var view = new MyView();
</script>
看一下View类的声明,将createDate,readData,updateData,deleteData加到了MyView的原型上。这里我们主要看一下构造器上的delegateEvents方法
delegateEvents: function(events) {
if (!(events || (events = _.result(this, 'events')))) return this;//没有代理事件,返回
this.undelegateEvents();//进入undelegateEvents方法,去除代理绑定
for (var key in events) {
var method = events[key];//获取自定义的方法名
if (!_.isFunction(method)) method = this[events[key]];
if (!method) continue;
var match = key.match(delegateEventSplitter);//将类似click #create分离获取
var eventName = match[1], selector = match[2];//获取触发事件动作名,获取选择器
method = _.bind(method, this);//绑定事件,将事件绑定到View的实例上
eventName += '.delegateEvents' + this.cid;
if (selector === '') {//监听事件
this.$el.on(eventName, method);//jQuery的原生on事件,低版本的jQuery注意
} else {
this.$el.on(eventName, selector, method);
}
}
return this;
}
看一下undelegateEvents方法
undelegateEvents: function() {
this.$el.off('.delegateEvents' + this.cid);//删除绑定事件
return this;
}
创建事件之前,先将以前可能存在的事件都删除掉。这里最后绑定事件的方法其实是jQuery的on方法,所以大家在引用第三方插件的时候,注意插件的版本。
另外就是这里的绑定事件都是绑定的都是p标签,所以使用事件委任,这写button在remove掉之后,再添加进来,依旧有事件。满足动态删减dom的情况。
内容不多,时间刚好,以上是我的一点读码体会,如有错误,请指出,大家共通学习。
backbone库学习-View的更多相关文章
- backbone库学习-Router
backbone库的结构http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文的例子来自http://blog.csdn.n ...
- backbone库学习-Collection
backbone库的结构: http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文所有例子来自于http://blog.cs ...
- backbone库学习-model
backbone库的结构: http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文所有例子来自于http://blog.cs ...
- backbone库学习-Events
backbone库的框架 http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 我们先从backbone的Events模块开始 ...
- 【转】Backbone.js学习笔记(二)细说MVC
文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...
- 【转】Backbone.js学习笔记(一)
文章转自: http://segmentfault.com/a/1190000002386651 基本概念 前言 昨天开始学Backbone.js,写篇笔记记录一下吧,一直对MVC模式挺好奇的,也对j ...
- python 操作exls学习之路1-openpyxl库学习
这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...
- dlib库学习之一
dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...
- python_库学习_01
一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...
随机推荐
- OpenMP之求和(用section分块完成)
// Sum_section.cpp : 定义控制台应用程序的入口点. //section功能:; //1.指定其内部的代码划分给线程中某个线程,不同的section由不同的线程执行; //2.将一个 ...
- 更改Android Studio的主题背景
看到别人炫酷的主题,好奇心使然,想要选择一个自己喜欢的炫酷背景,于是乎百度,动手尝试更换各种主题. 保存下来,留着以后想换主题的时候看. 1.Android Studio自带主题 File -> ...
- 安利eclipse插件之log4E
敲完代码之后,据说要加注释.加log:OTL~~~~~~~~,在我仰天长叹之际,师父发给我了一个插件压缩包,解压-->拷贝-->重启-->了事.安装方法已经如此之便捷,简直是我辈懒癌 ...
- loadrunner 的Administration Page页面设置
工作中用到Loadrunner不是很多,能够简单用用,深入的知识还得靠自己空余时自学.对于loadrunner 的Administration Page页面设置,我的理解是给自己设置各种障碍,然后一个 ...
- sphinx教程
http://www.php100.com/html/it/focus/2013/0916/6188.html### 以上一篇的email数据表为例: 数据结构: 01.CREATE TABLE em ...
- 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据
分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前 ...
- PCWIFI--无线网络共享软件
前段时间由于需要共享笔记本无线网络给手机使用,在网上找了几个软件试了一下,没找到比较好用的,要么是收费的,要么有广告,要么附带一大堆其他功能,所以决定自己写一个小软件来实现该功能.软件相关介绍如下: ...
- ASP.NET 5 入门 (2) – 自定义配置
ASP.NET 5 入门 (2) – 自定义配置 ASP.NET 5 理解和入门 建立和开发ASP.NET 5 项目 初步理解ASP.NET5的配置 正如我的第一篇文章ASP.NET 5 (vNext ...
- 创建动态WCF服务(无配置文件)
public class WCFServer { ServiceHost host = null; public WCFServer(string addressurl, string tcpurl, ...
- asp.net identity 2.2.0 中角色启用和基本使用(二)
建立模型 第一步:在Models文件夹上点右键 >添加>类 类的名称自定,我用AdminViewModels命名的 因为是讲基本使用,我这里不做任何扩展. 第二步:添加如下命名空间 ...