用Backbone.js创建一个联系人管理系统(五)
原文: Build a Contacts Manager Using Backbone.js: Part 5
这是这系列教程最后一部分了. 之前所有的增删改都在前端完成. 这部分我们要把Contact的数据存储到数据库里.
开始准备
在这里我们需要一个Web服务器,还有一个数据库. 可以是SQLServer.我们需要在
数据库中创建一个表来存储Concat. 表还要有一个主键ID,最好这个ID是unique和
自增长类型的. 虽然现在我们的Concat model里没有这个属性但是要把它存储到数
据库里ID还是有必要的.
Backbone的sync()
sync是Backbone.js提供给我们和服务器沟通的模块. 这是我们唯一还没用到的重要模块.
理解它后我们就可以完整的了解Backbone.js的整个框架.
调用sync()方法可以向服务器发送一个请求. 假设这个方法是通过调用JQuery或者Zepto来执行的请求.
又假设一个RESTful接口在后台使用POST,PUT,GET,DELETE,HTTP等方法.就像我们看到的,Backbone
能够用在headers中加入预处理动作的方法来配置GET,POST方法的回调函数(我觉得应该是call back他写错了).
除了直接调用sync(),models和collections也有方法可以用来和数据库通信. models有destory(),fetch(),
parse()和save()方法, collection有fetch()和parse()方法.不管是models还是collections的destroy(),fetch()
和sync()方法性能都不如sync().parse()方法在服务器返回数据后自动调用. 默认不做任何操作只是返回数据库
响应,但是你重写它来添加你希望在服务器响应前做的操作.
页面载入时的操作
让model数据显示到页面中的方法依赖后台技术.Backbone官方文档中collection的fetch()方法提到,这个方法不
能在页面初始化的时候从服务器请求数据.这部分在精华问答区有提到,一个页面在所有必需的模块没有完全载入前
应该避免初始化AJAX请求.当我们还不清楚一件事的时候听从别人的建议是比较好的主意.这会让我们的应用程序更
加稳定.让model数据显示到页面中的方法依赖后台技术.我们在这个例子里要使用.net技术. 所以需要创建一个<script>
标签来动态加载需要的js模块到页面里.做完这些后我们要开始把原来的index.html改成index.aspx. 当然我也也
需要index.aspx.cs存放后台代码.但是这会产生一个问题.在ASPX页面中使用Underscore微模版.我们可以把
Underscore文档中的Mustache-style例子直接拿来用.现在的问题是Underscore的模版使用<%=作为指定的占位符
来代替实际数据.这和ASPX页面.net代码使用的一样.Underscore的模版我们在ASPX页面里运行会报出服务器错误.
很幸运有几种办法能解决这个问题,其中最简单的是在模版中修改使用占位符的语法.
Underscore提供的templateSettings这个属性就是为了解决这样的问题的.他能够很容易的用指定的正则表达式来替
换成我们希望的符号.实际上我们可以直接拿'Mustache-style这个例子来用,在app.js文件开始(在闭包内)我们只要加入
以下代码:
_.templateSettings = {
interpolate: /\{\{(.+?)\}\}/g
};
所有这些支持一个正则表达式方法interpolate, 它允许我们使用{{property}}这个语法还替换<%= property%>
为此我们必须把所有原来的模版的标签替换成新的语法.尽管这和我们原来用的模版变化比很大, 至少我们现在可以用
Underscore了.我们对于Javascript使用<%的地方可以使用用<%-来转换数据.如果我们准备使用这些在我们的模版
里来替换interpolate属性. 我们应该也要配置Underscore里的evaluate和escape.属性.
准备Model数据
我们现在要考虑在页面初始化渲染的时候怎么样把model数据从数据库中如何取到我们的页面中来.我们能很容易的在
ASPX的类文件中加入一个简单的方法. 从数据库中读取记.创建一个对象列表. 每个对象能够表示一个联系人.我们接下
来把数据转化为Javascript数据类型并且插入到页面中.和前面四部分教程使用的模拟数据一样的格式. 我们不用改变前
端代码.作为数组的占位符,我们只要在页面的body里加入一个新的<script>标签. 直接把后台调用的代码放在app.js
引用的签名.后台代码的执行逻辑就是要从数据库取出数据列表然后序列化. 实现的方法有很多种,这些超出了本教程的范围.
我们更关注在页面初始化时如何得到这些数据.随时查看样例代码的文件是一个简单又快速的方法,但是这不是最好的做法.
在此基础上,我们必须要删除app.js里的联系人数组数据. 把页面运行在WVD或者ISS服务器上. 看看是不是和我们完成
第四部分的时候一样.
和服务器同步应用
在这个例子里我们用了.net4.0的asmx文件处理前端的请求.按后端看到的数据顺序发送它. 我们应该配置Backbone的
emulateHTTP和emulateJSON属性.在我们修改后的Underscore模版语法后加入下面代码:
Backbone.emulateHTTP = true;
Backbone.emulateJSON = true;
当你创建Backbone应用时你是否需要配置这些属性取决于于你你选择的后端技术是什么?看我们的应用程序编辑数据的
几种方法都实现了. 它能改变联系人的信息,能添加一个新的联系人. 还能够删除一个 已有的联系人.所有的这些前端逻辑
都有了,但是现在要从服务器调用这些方法得要修改.尽管之前页面已经做过渲染了,如果我们删除一个联系人. Backbone
还是会报一个错误,url has not been defined.原因是我们使用了destroy()方法在ContactView类的deleteContact()
方法里.来看看怎么让删除功能恢复正常.首先在model里得定义url属性.为Contact类添加url属性.
url: function () {
return "/ContactManager.asmx/ManageContact?id=" + this.get("id");
}
我们为url属性指定一个function,返回需要请求的url.在这个例子中我们用asmx文件去处理请求.我们还要为我们的Web
方法取一个名字(ManageContact) 并且使用model的id属性作为查询参数.现在如果我们在页面上删除一个联系人就向
Web Service提交了一个请求.DELETE方法的原理是在请求的HTTP 头中重写入指定的信息.(X-HTTP-Method-Override)
值为DELETE.利用这个方法我们能让Web service知道应该对数据库做什么操作.下步我们该修改ContactView类的
saveEdits()方法. 当一个联系人编辑完后. 像下面这样使用set()方法来告诉web service.
this.model.set(formData).save();
我们所有要做仅仅是在set()后接着再调用save().save()通过sync()方法代理向服务器提交请求.像之前一般使用PUT把
model的id作为查询字符串发送给服务器.这次http头的Content-Type设置为application/x-www-form-urlencoded.
(如果我们没有配置emulateJSON属性默认是application/json)并且model数据会以表单数据的形式发送. 所以我们修改
这个设置还是很有必要的.所有这些前端的修改都在DirectoryView类的addContact()方法中.之前这个方法里有一条if语句
检查model的类型是否已经存在来判断select按钮是否需要更新.现在我们要把这条if语句改成下面这个样子:
if (_.indexOf(this.getTypes(), formData.type) === -1) {
this.$el.find("#filter").find("select").remove().end().append(this.createSelect());
} this.collection.create(formData);
我们把if语句下面的else条件删除掉使代码更加简洁.我们还删除了add()方法并且增加create()方法在原来的位置.create()
方法实际上自动的增加一个model对象到collection中.不需要我们手动创建model实例. 并且通过sync()自动向服务器发送请求.
这次我们不用去设置http头的X-HTTP-Method-Override属性. 因为我们要用的POST方法使用了RESTful接口.和save()
方法一样. create()方法的数据也是以form data形式发送给服务器.和教程开始时候服务器端处理一样. 如何服务器端请求初始
化model数据也不属于本教程的范畴.我们仅仅关注前端部分.和之前教程一样. 本教程demo有包含注释的完整web service代码,
你感兴趣的化可以下载查看.而且还包含了数据库的备份文件. 你可以回复本分得到demo里的数据.
总结
这部分教程,我们学习了如果一些使用Backbone的sync()方法和后台通信的前端方法.我们看到Backbone通过缺省RESTful方式
请求一个指定的URL. 并且在REST的基础上通过配置和传统服务器一同工作.我们还学习了一些使用通过sync()代理和服务器通
信的方法.特别是remove(),save()和create()方法如何向服务器发送请求.我们还学习了如何使用正则表达式修改Underscore.js
模版的插入符号.联系人管理的培训现在结束了.当然我们还能为应用添加更多的功能.我们的教程已经包含用非常出色的Backbone.js
创建功能完善的应用程序的基础知识.
感谢你的阅读.
源文件下载链接: http://cdn.tutsplus.com/net/uploads/legacy/1151_bb5/demo.zip
用Backbone.js创建一个联系人管理系统(五)的更多相关文章
- 用Backbone.js创建一个联系人管理系统(一)
原文 Build a Contacts Manager Using Backbone.js: Part 1 在这个教程里我们将会使用Backbone.js,Underscore.js,JQuery创建 ...
- 用Backbone.js创建一个联系人管理系统(四)
原文: Build a Contacts Manager Using Backbone.js: Part 4 这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存. 本教程 ...
- 用Backbone.js创建一个联系人管理系统(二)
欢迎大家回来继续这一教程,第一部分我们学习了model,collection和view在Backbone中的 基本用法,还有怎么样用主视图去绑定collection去渲染出每个Contact. 这部分 ...
- 用Backbone.js创建一个联系人管理系统(三)
原文: Build a Contacts Manager Using Backbone.js: Part 3 欢迎回到这系列的教程,关注使用Backbone.js构建应用程序. 如果你还没看过第一,二 ...
- 使用 SVG 和 JS 创建一个由星形变心形的动画
序言:首先,这是一篇学习 SVG 及 JS 动画不可多得的优秀文章.我非常喜欢 Ana Tudor 写的教程.在她的教程中有大量使用 SVG 制作的图解以及实时交互 DEMO,可以说教程的所有细枝末节 ...
- 用three.js创建一个简易的天空盒
本文创建的天空盒是用六张图片来创建的.笔者会论述两种方法来创建,都是最简单基本的方法,不涉及着色器的使用.一种是创建一个盒子,然后将图片作为盒子6个面的纹理贴上来创建.另一种则是简单的将纹理作为场景的 ...
- JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出
rs = require("readline-sync"); let arr = []; console.log("请输入数组的长度:"); let arr_l ...
- 用Backbone.js教程系列的链接
整理了一下用Backbone.js系列教程链接. Backbone.js入门教程 用Backbone.js创建一个联系人管理系统(一) 用Backbone.js创建一个联系人管理系统(二) 用Back ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
随机推荐
- 一种table超出高度自动出滚动条的解决方案
在日常的开发过程中,我们可能会遇到这样一种需求,在指定高度内显示table,超过高度时表格出滚动条. 让我们带着这个问题,一起来探讨吧! <!DOCTYPE html> <html ...
- 数据库热备份工具innobackupex的安装
Xtrabackup是由percona开发的一个开源软件,此软件可以说是innodb热备工具ibbackup的一个开源替代品. 这个软件是由2个部分组成的:xtrabackup和innobackupe ...
- GridView控件RowDataBound事件中获取列字段途径
今天不知道怎么回事怎么也找不到gridview列中的控件,关键是其为编辑时隐藏域中的控件,取值就很成问题了,网上搜了很到,找到这个比较经典的东东了,可能大家都知道,但很少对比整理到一起,有多种方法可以 ...
- Tomcat安装及配置教程
工具/原料 Tomcat7.0 eclipse 百度经验:jingyan.baidu.com java环境的配置 1 java环境的配置应该都学过吧,这里简单的讲一下. 下载安装java JDK,注意 ...
- C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
原文地址:http://blog.csdn.net/wuyazhe/article/details/5627253 我们的串口程序,除了通用的,进行串口监听收发的简单工具,大多都和下位机有关,这就需要 ...
- python第二天-linux权限管理
(1)linux登陆密码忘了,怎么办? 把系统重启,在进入系统之前不断的按键盘左上角的"Esc"键会进入这样一个画面,按键盘上的e进入编辑. 进入这个画面以后,通过键盘的上下方向键 ...
- Java 对文件的读取操作
package pack; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- hdu5442 Favorite Donut
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5442 题目大意:给你一个长度为n的字符串,将它首尾相连成环.问你这个环上找一个长度为n的字典序最大的串 ...
- 自动验证是ThinkPHP
自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 数据验证有两种方式: 静态方式:在模型类里面通过$_validate属性定义验证规则 ...
- JSP中的 HttpSession、pageContext对象
pageContext 隐含对象对应javax.servlet.jsp.PageContext,都自动的被加入至pageContext中, 您可以由它来取得与JSP相关的对应之Servlet对象,像是 ...