用Backbone.js创建一个联系人管理系统(四)
原文: Build a Contacts Manager Using Backbone.js: Part 4
这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存.
本教程是基于这一系列的前三个教程. 有不清楚的请先阅读前三部分.
开始
在Contact原模版里添加一个edit按钮.
<button class="edit">Edit</button>
在原Contact显示模版下添加新的编辑模版
<script id="contactEditTemplate" type="text/template">
<form action="#">
<input type="file" value="<%= photo %>" />
<input class="name" value="<%= name %>" />
<input id="type" type="hidden" value="<%= type %>" />
<input class="address" value="<%= address %>" />
<input class="tel" value="<%= tel %>" />
<input class="email" value="<%= email %>" />
<button class="save">Save</button>
<button class="cancel">Cancel</button>
</form>
</script>
在ContactView的events中添加需要的新事件
"click button.edit": "editContact", //点击class="edit"的button 执行
"change select.type": "addType", //class="type"的select值改变时执行
"click button.save": "saveEdits", //点击class="save"的button 执行
"click button.cancel": "cancelEdit" //点击class="cancel"的button 执行
选择一个Contact来编辑
在Contact model定义中添加新的属性,指定编辑状态Contact用到的模版.
editTemplate: _.template($("#contactEditTemplate").html()),
在ContactView中定义editContact方法的实现.
editContact: function () {
this.$el.html(this.editTemplate(this.model.toJSON()));
var newOpt = $("<option/>", {
html: "<em>Add new...</em>",
value: "addType"
}),
this.select = directory.createSelect().addClass("type") //调用directory的createSelect()方法创建现有的select控件. 值为当前form的隐藏的#type的input值.
.val(this.$el.find("#type").val()).append(newOpt) //在控件里添加新的addType选项.
.insertAfter(this.$el.find(".name")); //把生成的DOM内容放到class="name"的控件后面.
this.$el.find("input[type='hidden']").remove(); //删除原来隐藏的#type的input.
},
增加新的type
在修改Contact时有可能会修改type为之前没有使用过的值.所以我们需要为ContactView添加一个新的方法
addType: function () {
if (this.select.val() === "addType") { //如果当前select的选项是addType
this.select.remove(); //删除select控件
$("<input />", {
"class": "type"
}).insertAfter(this.$el.find(".name")).focus(); //添加一个class="type"的input控件在class="name"控件后.
}
},
更新Contact
编辑完成之后我们还需要为编辑结果进行保存: 为ContactVew添加saveEdits方法.
saveEdits: function (e) {
e.preventDefault();
var formData = {},
prev = this.model.previousAttributes();
$(e.target).closest("form").find(":input").add(".photo").each(function () { //循环form下所有input
var el = $(this);
formData[el.attr("class")] = el.val(); //类名为属性给formdata赋值
});
if (formData.photo === "") {
delete formData.photo; //如果photo为空删掉使用默认值
}
this.model.set(formData);
this.render();
if (prev.photo === "/img/placeholder.png") {
delete prev.photo;
}
_.each(contacts, function (contact) { //循环每个Contact
if (_.isEqual(contact, prev)) { //如果值和原来相等.
contacts.splice(_.indexOf(contacts, contact), 1, formData); //用新的值替换原来的值
}
});
},
假如我们选择放弃自己的编辑,ContactView还需要一个取消编辑的方法
cancelEdit: function () {
this.render();
},
最后就是这个样子了.

这一节的代码下载:
http://cdn.tutsplus.com/net/uploads/legacy/1147_bb3and4/4/demo.zip
注: 原文内容里很多代码有问题. 不过下载后的代码都是可运行的. css文件我不太关注,基本就拷贝下载后源文件里的了.
用Backbone.js创建一个联系人管理系统(四)的更多相关文章
- 用Backbone.js创建一个联系人管理系统(五)
原文: Build a Contacts Manager Using Backbone.js: Part 5 这是这系列教程最后一部分了. 之前所有的增删改都在前端完成. 这部分我们要把Contact ...
- 用Backbone.js创建一个联系人管理系统(一)
原文 Build a Contacts Manager Using Backbone.js: Part 1 在这个教程里我们将会使用Backbone.js,Underscore.js,JQuery创建 ...
- 用Backbone.js创建一个联系人管理系统(二)
欢迎大家回来继续这一教程,第一部分我们学习了model,collection和view在Backbone中的 基本用法,还有怎么样用主视图去绑定collection去渲染出每个Contact. 这部分 ...
- 用Backbone.js创建一个联系人管理系统(三)
原文: Build a Contacts Manager Using Backbone.js: Part 3 欢迎回到这系列的教程,关注使用Backbone.js构建应用程序. 如果你还没看过第一,二 ...
- Vue.js+vue-element搭建属于自己的后台管理模板:创建一个项目(四)
Vue.js+vue-element搭建属于自己的后台管理模板:创建一个项目(四) 前言 本章主要讲解通过Vue CLI 脚手架构建工具创建一个项目,在学习Vue CLI之前我们需要先了解下webpa ...
- 使用 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 ...
随机推荐
- 动态设置和访问cxgrid列的Properties(转)
原文:http://www.cnblogs.com/hnxxcxg/archive/2010/05/24/2940711.html 动态设置和访问cxgrid列的Properties 设置: cxGr ...
- C# ADO.NET (sql语句连接方式)(查询)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- C# ASP.NET(配置数据库 sql server 地址的两种形式以及配置信息的获取)
( 1 ) 数据库装在本机,并且采用windows认证模式 <connectionStrings> <add name="SQLConnectionString&qu ...
- 动态加载script文件的两种方法
第一种就是利用ajax方式,把script文件代码从后台加载到前台,然后对加载到的内容通过eval()执行代码.第二种是,动态创建一个script标签,设置其src属性,通过把script标签插入到页 ...
- [Tomcat 源码分析系列] (一) : Tomcat 启动脚本-startup.bat
概述 我们通常使用 Tomcat 中的 startup.bat 来启动 Tomcat. 但是这其中干了一些什么事呢? 大家都知道一个 Java 程序需要启动的话, 肯定需要 main 方法, 那么这个 ...
- CSS基础01
1.line-height:设置每行的高度,默认是会以文字的高度来决定 2.text-align:设置文本的对齐方式 3.vertical-align: sub 垂直对齐文本的下标. super 垂直 ...
- 学习Linux入门50个基本命令
Linux系统以一切皆文件的方式运行系统.虽然存在ubuntu版本的图形界面,但在企业的服务器里面还是以命令行系统运行为主. 以下是初学50个基本的Linux命令行的体会 1:pwd 显示当前你所在的 ...
- Python全栈开发day5
一.lambda表达式 对于简单的函数,存在一种简便的表示方式,即:lambda表达式 1 2 3 >>> shaw = lambda x,y:x + y >>> ...
- vim 使用2 转载 为了打开方便
http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个 ...
- Java画图程序设计
本文讲述一个画图板应用程序的设计,屏幕抓图如下: 『IShape』 这是所有图形类(此后称作模型类)都应该实现接口,外部的控制类,比如画图板类就通过这个接口跟模型类“交流”.名字开头的I表示它是一个接 ...