前言

这两天看了下Backbone.js的知识,大概了解了这个框架的一些知识。 写篇博客总结一下。

Backbone.js是一个web端javascript的轻量级MVC框架。为什么说是轻量级呢?因为它基于underscore(基于jQuery)和jQuery这2个框架,熟悉jQuery的小伙伴们可以快速入门Backbone.js。

为何使用Backbone

使用Backbone.js可以让你像写Java代码一样对js代码进行组织,比如定义类,类的属性、方法,这点非常重要。

比如传统的js开发是这样的:

<input type="button" value="save" onclick="save()"/>
<input type="button" value="add" onclick="add()"/> ... // js代码
function save() {
...
}
function add() {
...
}
</script>

页面内容一多,js代码会分布在页面的各个角落,维护、开发都很麻烦。

使用Backbone处理:

var AppView = Backbone.View.extend({
el: "body", // 事件
events: {
'click input[type=button][value=add]': 'add',
'click input[type=button][value=save]': 'save'
}, add: function(event) {
...
}, save: function(event) {
...
} }); var appView = new AppView;

使用Backbone之后,所有js的代码都会在同一个地方,也就是对js代码进行了组织,我只需要管理这段js代码即可,前面button里的onclick事件就不需要单独写了。

Backbone中的几个重要概念

Backbone中有4个重要的概念,分别是Model,Collection,View,Router。

Model

Model是Javascript应用程序的核心,包括基础的数据以及围绕着这些数据的逻辑:数据转换、数据验证、访问控制。自定义的Model可以继承Backbone.Model。1个Person实体:

var Person = Backbone.Model.extend({
initialize: function() {
// 构造实例的时候会调用这里
},
//默认属性
defaults: {
name: 'unknow',
age: 0
},
validate: function(attributes) {
if(!attributes.age || attributes.age < 0) {
return "年龄小于0,出问题了";
}
},
customMethod: function() {
console.log("自定义方法");
}
}); // 实例化1个Person对象
var person = new Person;
console.log(person.get('name')); // unknow
console.log(person.get('age')); // 0 person.set('name', 'format');
console.log(person.get('name')); // format person.set({name: 'james', age: 33});
console.log(person.get('age') + ', ' + person.get('age')); // james, 33 person.customMethod(); // 自定义方法 //设置其他属性
person.set({birth: '1977-12-15'});
console.log(person.get('birth')); // 1977-12-15 console.log(person.attributes); //{name: "james", age: 33, birth: "1977-12-15"} if(!person.set({age: '-1'})) { //set属性默认不验证,这边set age 0,可以设置进去
console.log('设置age属性出错------11'); //这里不会打印
} if(!person.set({age: '-1'}, {validate: true})) { //set 的时候加上validate: true, 让其验证,这里验证出错返回false
console.log('设置age属性出错------22'); //这里会打印
}

更加详细的资料请参考Model

Collection

Collection, 集合, 也就是多个Model,很好理解。

可以绑定'change', 'add', 'remove'事件到集合上以监听集合的数据状态。

// 这里的代码依赖之前的Person这个Model
var Family = Backbone.Collection.extend({
model: Person,
initialize: function() {
//构造集合会调用这里
}
}); var father = new Person({name: 'father', age: 42});
var mother = new Person({name: 'mother', age: 40}); var family = new Family([father, mother]); family.bind('change', function(person) {
console.log('family集合有数据改变了: ' + person.get('age'));
}); family.bind('add', function(person) {
console.log('family集合有数据进来了: ' + person.get('name'));
}); family.bind('remove', function(person) {
console.log('family集合有数据被删掉了: ' + person.get('name'));
}); // 触发add事件
family.add(new Person({name: 'son', age: 0}));
// 触发remove事件
family.remove(father);
// 触发change事件
mother.set('age', 41); // 查询
console.log(family.where({name: 'son'})); [son] // 触发add事件
family.add(father); // 比较器,排序使用
family.comparator = 'age';
family.sort(); //根据age排序,并从对象里拿出name属性
console.log(family.pluck('name')); // ["son", "mother", "father"]

更加详细的资料请参考Collection

View

Backbone的View是用来显示你的model中的数据到页面的,同时它也可用来监听DOM上的事件然后做出响应。

html:

<ul id="persons">

</ul>
<input type="button" value="add"/>

javascript:

$(document).ready(function() {

    var AppView = Backbone.View.extend({
// 注意这里的el是body,不然的话下面的事件绑定不了。下面事件的element是基于el进行查找的
el: 'body', events: {
'click input[type=button][value=add]': 'add',
'click #persons li': 'remove'
}, add: function(event) {
var name = window.prompt("请输入名字");
this.$('#persons').append('<li>' + name + '</li>');
}, remove: function(event) {
$(event.target).remove();
} }); var appView = new AppView; });

更加详细的资料请参考View

Router

Router既控制器,用来监控一些#(锚)地址的访问情况。

var AppRouter = Backbone.Router.extend({

    routes: {
//* 代表全部, : 代表1个
"all/*action": "actionRoute", // all/*action 会截获all/后面全部的地址
"posts/:id": "posts", // :id 会截获
"trigger": "trigger"
}, actionRoute: function(actions) {
console.log("all/*action生效了,具体的地址: " + actions);
}, posts: function(id) {
console.log("posts/:id生效了,id: " + id);
}, trigger: function() {
//手动触发其他route, 参数trigger表示触发事件,如果为false,则只是url变化,并不会触发事件,replace表示url替换,而不是前进到这个url,意味着启用该参数,浏览器的history不会记录这个变动。
appRouter.navigate("/posts/" + 404, {trigger: true, replace: true});
} }); var appRouter = new AppRouter; // 使用Router必须要有以下这个代码
Backbone.history.start();

更加详细的资料请参考Router

总结

总结了一下Backbone中4大核心概念的知识,接下来准备写一个使用Backbone的小项目。

吐槽一下,这篇文章用markdown写的,cnblog中的markdown里使用了highlightjs对代码进行了着色,但是楼主以前在博客园里就是用hightlightjs的,现在两者冲突了, 蛋疼。

还有h2标签生成的时候id属性有问题。 所以就先不贴菜单了。

参考资料:

https://github.com/the5fire/backbonejs-learning-note

http://www.cnblogs.com/yexiaochai/archive/2013/07/27/3219402.html

Backbone小记录的更多相关文章

  1. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  2. Java 需要记得、了解的关键词 (Java 学习中的小记录)

    Java 需要记得.了解的关键词 (Java 学习中的小记录)     作者:王可利(Star·星星) 总结:本次随笔,仅且拿来平时翻阅记忆用

  3. 关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录)

    关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录)   作者:王可利(Star·星星) HTML中 相对定位:position:relative; 绝对定位:position ...

  4. 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)

    利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)   作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...

  5. html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)

    html/css  盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width     是"宽 ...

  6. NDK开发小记录 C++读取java层对象内容

    这是自己NDK开发得小记录,关于C++层读取java层传来的对象内容. 很简单的一个例子, 1.首先在java层定义了一个类NumList: public class NumList { public ...

  7. centos 6.X minimal 系列最小化安装完成后,安装mono和jexus过程小记录

    在使用虚拟机安装minimal版centos运行mono+jexus的时候,遇到了一些坑,记录一下,比如虚拟机访问不了网络,没wget命令没开放80端口,等等小问题,其他网上教程已经有mono+jex ...

  8. HorizontalScrollView做页卡的一个小记录

    用HorizontalScrollView做页卡,实现一个如下图的效果:

  9. easy-ui JOB 及 小记录

    $:获取  $.ajax({             type: "POST" ,             url: "" ,             cont ...

随机推荐

  1. C++静态计算的例子

    写一个函数,用递归函数完成以下运算: sum(n) =  1 – 1/2 + 1/3 – 1/4 + … -(1/n)*(-1)n        (其中n>0) 函数原型:         fl ...

  2. MySQL 之 query cache

    早上一打开网站,就看到了Percona官网发布的最新的关于 mysql query cache的文章: https://www.percona.com/blog/2015/08/07/mysql-qu ...

  3. linux下批量修改存有超大数据量IP文件中的IP内容以及去重排序

    作为一个linux的学徒,分享一下自己解决这个小问题的心得,在处理这个问题时使用了一个小技巧感觉很适用,个人发觉linux的终端真滴是非常强大,下面就详细地介绍这个问题以及解决办法吧 问题描述:由于要 ...

  4. hibernate一对一关系实现

    按照主键映射,按照外键映射 Address.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping P ...

  5. 10901 Missile

    10901 Missile 时间限制:1000MS  内存限制:65535K提交次数:40 通过次数:7 Description Long, long ago, country A invented ...

  6. Android ANR分析

    1.发生anr时手机会生产traces文件 拉取trace文件:adb pull data/anr/traces.txt ./mytraces.txt 保存路径 参考

  7. Hive drop table batched

    if the hive version not support drop table tablename purge. your drop table command will move data t ...

  8. NOIP2008 T3 传纸条 解题报告——S.B.S.

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  9. 【转】C语言位运算符:与、或、异或、取反、左移与右移详细介绍

    转载自:http://www.jb51.net/article/40559.htm,感谢原作者. 以下是对C语言中的位运算符:与.或.异或.取反.左移与右移进行了详细的分析介绍,需要的朋友可以过来参考 ...

  10. 最小生成树 2429: [HAOI2006]聪明的猴子

    BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 877  Solved: 566[Submit][ ...