欢迎大家回来继续这一教程,第一部分我们学习了model,collection和view在Backbone中的

基本用法,还有怎么样用主视图去绑定collection去渲染出每个Contact.

这部分我们学习怎么通过用户输入过滤视图中的数据还要怎么给我们的应用程序加入路由的功能.

响应用户输入

从第一部分你可以发现每个model都有一个属性type,这个属性可以把model分成朋友,家人,同事等等.

让我们给主视图加入一个select控件来对models进行按type类型选择的操作.

我们当然可以将select的option写死,那样显然可维护性很差.虽然我们现在还没有添加或者删除Contacts的

功能,但是肯定将来要添加的.提前透露第三部分教程我们将完成这个功能. 废话还是太多了,肯定是要从现有记录

的type里读取了. 但是之前要先在Contacts的容器里加上装载select的容器.

    <header>
<div id="filter"><label>Show me:</label></div>
</header>

我们用个header元素包裹的指定id的div元素做容器,

下面是在主视图DirectoryView中创建select的代码.

getTypes: function () {
return _.uniq(this.collection.pluck("type"), false, function (type) {
return type.toLowerCase();
});
}, createSelect: function () {
var filter = this.el.find("#filter"),
select = $("<select/>", {
html: "<option>All</option>"
}); _.each(this.getTypes(), function (item) {
var option = $("<option/>", {
value: item.toLowerCase(),
text: item.toLowerCase()
}).appendTo(select);
});
return select;
}

collection.pluck():是Backbone.js的中方法,作用是从Collection中取出所有models的指定属性(这里是type)值得数组.

_.uniq:是Underscore.js中的方法. 去除指定数组中重复的数据. 第一个参数是数组,第二个参数是否重新排序可选true或false.

在这里是去掉pluck后得到数组里的重复元素.第三个参数为function,可以指定对每个数组元素要做的操作.

_.each:是Underscore的方法. 第一个参数是要处理的数组,第二个参数是funtion对每个数组元素的操作.这里把去掉重复数据后

的types数组的每个元分别赋给一个option的value和text属性后添加到select元素里.

最后在初始化结束后initialize()方法里把生成的select的html放入id为filter的div.

this.$el.find("#filter").append(this.createSelect());

$el为Backbone.js视图对象中缓存当前视图的JQuery对象.

过滤视图

现在我们有了select按钮,为了让按钮可以响应过滤models,我们先在主视图中添加一个events属性.

events: {
"change #filter select": "setFilter"
},

这样"change #filter select"(id为filter的tagName为select的子元素值变化)时候执行setFilter方法,我们在补充setFilter方法:

        setFilter: function (e) {
this.filterType = e.currentTarget.value;
this.trigger("change:filterType");
},

在这个方法里先把select的选择结果(e.currentTarget.value)存储到局部变量filterType里,然后触发change:filterType事件.

定义当type改变时候的具体操作方法.

filterByType: function () {
if (this.filterType === "all") {
this.collection.reset(contacts); //重置collection
} else {
this.collection.reset(contacts, { silent: true }); //重置collection但不刷新页面 var filterType = this.filterType,
filtered = _.filter(this.collection.models, function (item) {
return item.get("type").toLowerCase() === filterType;
});
      
this.collection.reset(filtered);
}
}

_.filter是Underscore.js中的方法. 过滤出指定的type的contacts.

对Collection加载监听器

最后挂载事件监听,第一个其实不是针对collection的而是自定义局部变量filterType变量监听.

this.on("change:filterType", this.filterByType, this);

每次对collection执行reset后. view并不会自动刷新前端. 所以还要为reset事件加载监听.

this.collection.on("reset", this.render, this);

这样每当view的collection执行reset. 都会重新render显示的内容.

路由

现在我们可以通过select控件来过滤Contacts,但是如果通过URL来过滤会不会更好呢. Backbone.js的router

就能实现这个功能. 很简单也是使用Backbone.router的extend();

var ContactsRouter = Backbone.Router.extend({
routes: {
"filter/:type": "urlFilter"
}, urlFilter: function (type) {
directory.filterType = type;
directory.trigger("change:filterType");
}
});

用过其他MVC的router对象的一看就明白: routes属性里定义一种路由格式( "filter/:type"). 如果需要也可以扩展更多.

"urlFilter"为路由执行的方法. 下面的urlFilter是方法的实现.

最后在初始化DirectioryView后面初始化一个router.

 var contactsRouter = new ContactsRouter();

然后为了解决浏览器后退问题要再上一句

Backbone.history.start();

为了在type值变化时对应浏览器url的跳转更新filterByType方法. 增加contactsRouter.navigate到指定的url

filterByType: function () {
if (this.filterType === "all") {
this.collection.reset(contacts); <b>contactsRouter.navigate("filter/all");</b> } else {
this.collection.reset(contacts, { silent: true }); var filterType = this.filterType,
filtered = _.filter(this.collection.models, function (item) {
return item.get("type") === filterType;
}); this.collection.reset(filtered); <b>contactsRouter.navigate("filter/" + filterType);</b>
}
}

最后测试一下结果

总结

这部分主要学习了Backbone.js的路由对象.和一些Underscore.js的方法. 例如_.uniq() _.filter()

下一部分教程我们会回到model,学习如何在collection中添加和删除model.

这节课代码:

http://cdn.tutsplus.com/net/uploads/legacy/1143_bb2/demo.zip

用Backbone.js创建一个联系人管理系统(二)的更多相关文章

  1. 用Backbone.js创建一个联系人管理系统(五)

    原文: Build a Contacts Manager Using Backbone.js: Part 5 这是这系列教程最后一部分了. 之前所有的增删改都在前端完成. 这部分我们要把Contact ...

  2. 用Backbone.js创建一个联系人管理系统(一)

    原文 Build a Contacts Manager Using Backbone.js: Part 1 在这个教程里我们将会使用Backbone.js,Underscore.js,JQuery创建 ...

  3. 用Backbone.js创建一个联系人管理系统(四)

    原文: Build a Contacts Manager Using Backbone.js: Part 4 这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存. 本教程 ...

  4. 用Backbone.js创建一个联系人管理系统(三)

    原文: Build a Contacts Manager Using Backbone.js: Part 3 欢迎回到这系列的教程,关注使用Backbone.js构建应用程序. 如果你还没看过第一,二 ...

  5. 使用 SVG 和 JS 创建一个由星形变心形的动画

    序言:首先,这是一篇学习 SVG 及 JS 动画不可多得的优秀文章.我非常喜欢 Ana Tudor 写的教程.在她的教程中有大量使用 SVG 制作的图解以及实时交互 DEMO,可以说教程的所有细枝末节 ...

  6. 用three.js创建一个简易的天空盒

    本文创建的天空盒是用六张图片来创建的.笔者会论述两种方法来创建,都是最简单基本的方法,不涉及着色器的使用.一种是创建一个盒子,然后将图片作为盒子6个面的纹理贴上来创建.另一种则是简单的将纹理作为场景的 ...

  7. Gitlab创建一个项目(二)创建新用户以及分配项目

    Gitlab创建一个项目(一) 1.进入gitlab控制台 2.点击“新建用户” 3.点击“Edit”,创建初始密码 4.分配项目,首页进入项目 5.进入Members菜单 6.选择用户 7.赋予权限 ...

  8. 十八、Node.js创建Web服务器(二)

    在上一篇文章中我们在自定义模块自定义了几种文件类型的头文件加工的方法: /** * 自定义模块加工响应头文件类型 */ module.exports.getminiName=function (ext ...

  9. JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出

    rs = require("readline-sync"); let arr = []; console.log("请输入数组的长度:"); let arr_l ...

随机推荐

  1. SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历?

    二者的定义:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有 ...

  2. (gridcontrol等)通用导出excel z

    关于DevExpress Winform 的所有可打印控件的导出excel 的通用方法,并且解决DevExpress控件自带的方法存在的缺陷问题 1.解决GridControl自带方法不能导出图片: ...

  3. [HTML] CSS3 文本效果

    CSS3 文本效果 CSS3中包含几个新的文本特征. 在本章中您将了解以下文本属性: text-shadow word-wrap 浏览器支持

  4. IIS部署WCF

    IIS部署WCF [转载自——http://www.cnblogs.com/starksoft/p/4992059.html] 1 部署IIS 1.1 安装WAS IIS原本是不支持非HTTP协议的服 ...

  5. ubuntu14.04网络设置

    修改ip: /etc/network/interfaces

  6. [oracle] update和merge语句的几点写法

    1.update t2 set parentid=(select ownerid from t1 where t1.id=t2.id); 2. update tb_client_win_lost_re ...

  7. jquery radio取值,checkbox取值,select取值及选中

    jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关 获取一组radio被选中项的值 var item = $('in ...

  8. C++ 类里面,函数占用存储空间问题

    转载自:http://blog.163.com/xping_lsr/blog/static/19654034520119804131721/ 先看两段代码: 代码段1:class A{public:i ...

  9. iframe的用法

    iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 属性: 创建内联框架(JSP页面) <%@ page language="java" import=&qu ...

  10. Hibernate对象的状态

    站在持久化的角度, Hibernate 把对象分为 4 种状态: 1. 持久化状态 2. 临时状态 3. 游离状态 4. 删除状态 Session 的特定方法能使对象从一个状态转换到另一个状态. 下面 ...