原文: 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创建一个联系人管理系统(五)的更多相关文章

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

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

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

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

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

    欢迎大家回来继续这一教程,第一部分我们学习了model,collection和view在Backbone中的 基本用法,还有怎么样用主视图去绑定collection去渲染出每个Contact. 这部分 ...

  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. JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出

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

  8. 用Backbone.js教程系列的链接

    整理了一下用Backbone.js系列教程链接. Backbone.js入门教程 用Backbone.js创建一个联系人管理系统(一) 用Backbone.js创建一个联系人管理系统(二) 用Back ...

  9. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

随机推荐

  1. Exynos 4412 Uboot源码解析

    原文地址:http://www.cnblogs.com/jacklu/p/6226330.html Exynos 4412 Uboot的汇编代码就不贴了,没有的可以私信我. 这是我当时阅读代码时的思维 ...

  2. 在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值)

    转载自: http://blog.csdn.net/jdsjlzx/article/details/7606423

  3. git和github

    GIT是一款分布式版本控制系统.与SVN相比可以不依赖网络,并且对分支和合并有更好的支持.但是命令稍微复杂一些,这里简单介绍使用git将项目上传到github. 首先GIT安装只需要去官网下载安装即可 ...

  4. python的类与对象

    类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...

  5. 读Javascript高级程序设计第三版第六章面向对象设计--创建对象

    虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是缺点非常明显:使用同一接口创建很多对象,会产生大量重复代码. 工厂模式  1 function CreatePerson(name,a ...

  6. 使用小米天气API获取天气信息

    1. URL部分 以下url中"%s"代表的是城市Id,比如北京的cityId=101010100: //获取未来五天预报信息,红色部分信息不需要 WEATHER_DATA_URL ...

  7. Linux基础-常用命令

    常用的压缩命令 一.tar 1.压缩:tar zcvf [压缩包名].tar.gz [待压缩的文件名 ... ] 2.解压缩:tar zxvf [压缩包名].tar.gz -C [指定的解压目录] 3 ...

  8. [OC笔记] protocol之我的见解

    OC中的protocol就是和JAVA中interface差不多的东西,但是又不是完全一样的.这个protocol常用来实现委托,也就是自己不实现,当事件产生的时候去回调委托者. 让委托者去执行响应的 ...

  9. easyui 中datagrid 点击行的事件

    $('#datagrid 的ID').datagrid({                onClickRow:function(index,data)                {        ...

  10. 原生js arguments 用法

    http://note.youdao.com/noteshare?id=fcd201e872e1ede16ce0057a1909f613