用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 姓…

HOJ-2662Pieces Assignment(状态压缩,动态规划)

Pieces Assignment Source : zhouguyue Time limit : 1 sec Memory limit : 64 M Submitted : 415, Accepted : 149 Background 有一个n*m的棋盘(n、m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子&#xff0c;使得任意两个棋子不相邻&#xff08;每个棋子最多和周围4个棋子相…

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

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

《5》CentOS7.0+OpenStack+kvm云平台的部署—组态Horizon

感谢朋友支持本博客&#xff0c;欢迎共同探讨交流&#xff0c;因为能力和时间有限&#xff0c;错误之处在所难免&#xff0c;欢迎指正&#xff01;假设转载。请保留作者信息。 博客地址&#xff1a;http://blog.csdn.net/qq_21398167 原博文地址&#xff1a;http://blog.csdn.n…

python怎么打开一个窗口_python – 使按钮一次只打开一个窗口(通过关闭Toplevel窗口启用按钮)...

我希望NewWinButton一次只创建一个新窗口,这意味着如果if NewWin.winfo_exists() 1:NewWinButton.config(statedisabled)else:NewWinButton.config(statenormal)如果我在新窗口中添加一个按钮(本例中为QuitButton),我可以使这个工作&#xff1a;import tkinter as tkroot tk.…

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

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

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

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

什么是JSONP以及它是怎么产生的

什么是JSONP以及它是怎么产生的 1.什么是jsonp JSONP(JSON with Padding)是一个非官方的协议&#xff0c;它允许在服务器端集成Script tags返回至客户端&#xff0c;通过javascript callback的形式实现跨域访问&#xff08;这仅仅是JSONP简单的实现形式…

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

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

Mysql经常使用命令

1.导出整个数据库 mysqldump -u username -p --default-character-setlatin1 数据库名 > 导出的文件名称(数据库默认编码是latin1) mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导出一个表 mysqldump -u username -p 数据库名 表名> 导出的文件名称 mysqldump …

stack heap java_java中的Heap 和 Stack | 学步园

1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C不同&#xff0c;Java自动管理栈和堆&#xff0c;程序员不能直接地设置栈或堆。2. 栈的优势是&#xff0c;存取速度比堆要快&#xff0c;仅次于直接位于CPU中的寄存器。但缺点是&#xff0c;存在栈中的数据大小与…

JavaScript密码复杂度

<!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title>密码复杂度</title></head><body><script type"text/javascript"> //密码复杂度var pwprompt("请输入密…

最后关于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的标…

input hidden用法

之前获取数据传数据&#xff0c;都是写在全局变量里&#xff0c;今天老板告诉我说用input hidden来存&#xff0c;我百度了一下&#xff0c;确实是个好方法&#xff0c;记录之&#xff1a; 1 隐藏域在页面中对于用户是不可见的&#xff0c;在表单中插入隐藏域的目的在于收集或发…

java 静态方法 多线程_Java静态方法的线程安全性问题

如果多个线程同时访问同一个静态方法&#xff0c;后一个线程传递的参数值会覆盖前一个线程传递的参数值吗&#xff1f;代码示例如下&#xff1a;被访问的静态资源&#xff1a;public class C {public static void test(String[] value) throws InterruptedException{Thread.sle…

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能识别的指令即可&#…

java 验证码 添加背景图_java登陆界面怎么加背景图 会的我加你

publicvoiduserInit(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭框架的同时结束程序this.setSize(500,300);//设置框架大小为长500,宽300this.setResizable(fa...public void userInit(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关…

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

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