用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的选项是addTypethis.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下所有inputvar 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) {                       //循环每个Contactif (_.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文件我不太关注,基本就拷贝下载后源文件里的了.

 

转载于:https://www.cnblogs.com/dangkei/p/5048714.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql默认时间怎么不同步_MYSQL 更新时间自动同步与创建时间默认值共存问题

本文作者&#xff1a;苏生米沿在使用SQL的时候&#xff0c;希望在更新数据的时候自动填充更新时间&#xff0c;那么在mysql中是如何实现的呢&#xff1f;如创建表usersCREATE TABLE RS_SIGNUPUSER (ID VARCHAR(36) COMMENT 主键(业务功能无关),USERNAME VARCHAR(50) COMMENT 姓…

python代码技巧_让你python代码更快的3个小技巧

大家好&#xff01;今天呢&#xff0c;我们来聊一聊如何加速你的 python 代码。Python 语言的优点可以列举出许多&#xff0c;语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西&#xff0c;python 一个明显缺点就是运行速度慢&#xff0c;至少跟 C 语言没法比…

从此走上一条iOS程序猿不归路。。。

新的城市&#xff0c;新的生活&#xff01;前不久刚刚结束了苦逼的面试找工作之旅&#xff0c;期间也小有收货&#xff0c;如今正处年底工作闲暇之余&#xff0c;将前一阵子陆陆续续的总结整理了一下&#xff0c;本人菜鸟程序猿一只&#xff0c;水平有限&#xff0c;本文总结的…

springboot mysql事物_在Spring Boot中使用数据库事务

关于数据库访问还有一个核心操作那就是事务的处理了&#xff0c;前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了&#xff0c;其实不用猜&#xff0c;我们也知道Spring Boot在数据库事务处理问题上也给我们带来惊喜&#xff0c;OK&#xff0c;废话不多说&#…

cinder连接mysql数据库_Openstack入门篇(十六)之Cinder服务的部署与测试

1.理解块存储服务操作系统获得存储空间的方式一般有两种&#xff1a;通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘&#xff0c;然后分区、格式化、创建文件系统&#xff1b;或者直接使用裸硬盘存储数据(数据库)通过 NFS、CIFS 等 协议&#xff0c;mount 远程的文件系统第一种…

最后关于Pipeline完整的图如下:

最后关于Pipeline完整的图如下&#xff1a; 转载于:https://www.cnblogs.com/aaa6818162/p/5077988.html

amr 转mp3 java_JAVA 音频转换AMR 转MP3,OS,Linux cent os 7

场景近期在做微信开发时&#xff0c;需要获取用户发给公众服务号的语音留言。而从微信服务端下载来的语音格式却是amr的格式&#xff0c;同样的你手机录音、Android语音等也都是生成amr格式文件。但当你想在web页面去播放此文件时&#xff0c;就困难了。因为无论是当前HTML5的标…

dragloader.js帮助你在页面原生滚动下实现Pull Request操作

dragloader.js是一个面向移动Web开发的JavaScript库&#xff0c;帮助开发者在使用页面原生滚动时&#xff0c;模拟上/下拉手势&#xff0c;实现Pull Request操作。 在移动设备上&#xff0c;一般会使用 drag down 手势实现加载最新 使用 drag up 手势实现加载更多 dragloader样…

怎么运行java虚拟机_Java代码如何运行在Java虚拟机中

我们都知道要运行Java代码就必须要有JRE&#xff0c;也就是Java运行时环境&#xff0c;JRE中包含了Java程序的必需组件&#xff0c;包括Java虚拟机以及Java核心类库&#xff0c;然而运行C代码则不需要额外的运行时环境&#xff0c;只需要把代码编译成CPU能识别的指令即可&#…

【AJAX】AJAX实现搜索信息自己主动推荐并补全

好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完。我们在搜索引擎中输入文字时文本框下会提示对应的信息&#xff0c;这个案例就是实现这样的基本功能&#xff0c;代码比較粗糙还须要进一步完好&#xff0c;当中有些地方也须要向大神们请教一下。完毕效果截图&am…

使用IntelliJ IDEA 14和Maven创建java web项目

安装Maven 下载安装 去maven官网下载最新版。 解压到安装目录。 配置 右键桌面的计算机图标&#xff0c;属性–>高级系统设置–>环境变量&#xff0c;添加M2_HOME的环境变量&#xff0c;然后将该变量加入的PATH中。 注意 必须要有JAVA_HOME和个环境变量&#xff0c;不然m…

工作那点小事

目录 工作那点小事总结回到顶部工作那点小事 离开了“火龙果”&#xff0c;领导&#xff0c;领导的领导&#xff0c;领导的领导的领导&#xff0c;同事&#xff0c;同事等等&#xff0c;给你上了一堂课。 面试时&#xff0c;问&#xff1a;为什么离开上一家公司&#xff1f;答&…

Testlink1.9.5的安装配置

前两天搭建了Testlink环境&#xff0c;在这里整理记录下过程中遇到的问题以及搭建流程。Testlink版本&#xff1a;1.9.5操作系统&#xff1a;Windows7 32bit 步骤一&#xff1a;安装XAMPP 下载解压xampp压缩包&#xff0c;点击安装包xampp-win32-1.8.0-VC9-installerservice se…

UIAutomator输入中文

之前一直是英文的测试环境&#xff0c;包括手机也是英文的&#xff0c;app也是英文的&#xff0c;涉及不到中文输入法的东西。但现在在写中文的app&#xff0c;所以需要输入中文。看到网上的解决办法如下: 下载https://github.com/sumio/uiautomator-unicode-input-helper源码 …

jni java返回数组_Android开发实践:Java层与Jni层的数组传递

Android开发中&#xff0c;经常会在Java代码与Jni层之间传递数组(byte[])&#xff0c;一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层&#xff0c;由Jni层的Socket代码发送出去&#xff0c;当然&#xff0c;Jni层也需要把从Socket接收到的数据流返回给Java层。我…

jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...

由JspMysql注入到root权限的全程展最近有点空闲,所以写点垃圾文章来消磨一下时间.文中没有什么技术含量,如果要转载,请注明作者并保持文章的完整.很多人可能都知道asp,php的编程要防止sql注入漏洞,而并不知道jsp编程同样也需要防备sql注入漏洞.其实,一旦jsp代码有注入漏洞,将直…

Divide and conquer:Dropping tests(POJ 2976)

最大化平均值 题目大意&#xff1a;给定你n个分数&#xff0c;从中找出k个数&#xff0c;使∑a/∑b的最大值 这一题同样的也可以用二分法来做&#xff08;用DP会超时&#xff0c;可见二分法是多么的实用呵&#xff01;&#xff09;&#xff0c;大体上是这样子&#xff1a;假设最…

java中标准封装结构_java中的构造,封装

今天给大家讲一下面向对象中的构造&#xff0c;封装&#xff1b;构造&#xff1a;构造方法有以下几个特点&#xff1a;1.方法名和类名一致。2.无返回类型。接下来的几种构造样式&#xff0c;直接上代码吧&#xff1a;//这是一个宠物类 有一个属性&#xff1a;名字(name)public …

《白日梦想家》观后感

To see the world, things dangerous to come to, To see behind walls, to draw closer, To find each other and to feel That is the Purpose of LIFE.” 这部片子我很喜欢&#xff0c;大概我在现实生活中&#xff0c;也就是一个梦想家吧。想过很多事&#xff0c;但是真正去…

linux隐藏tomcat版本_Ubuntu 14.04隐藏Tomcat-7.0.52的版本号与操作系统类型

一般情况下&#xff0c;软件的漏洞信息和特定版本&#xff0c;特定操作系统是相关的&#xff0c;因此&#xff0c;软件的版本号以及操作系统类型对攻击者来说是很有价值的。在默认情况下&#xff0c;Tomcat会在返回信息中把自身的版本号&#xff0c;操作系统类型都显示出来&…