AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除
AngularJS实现表格数据的编辑,更新和删除
效果
实现
首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据
- var app = angular.module('plunker', ['ui.bootstrap']);
- app.controller('MainCtrl', function($scope) {
- $scope.name = 'World';
- $scope.employees =[{id:101, name:'John', phone:'555-1276'},
- {id:102, name:'Mary', phone:'800-1233'},
- {id:103,name:'Mike', phone:'555-4321'},
- {id:104,name:'Adam', phone:'555-5678'},
- {id:105,name:'Julie', phone:'555-8765'},
- {id:106,name:'Juliette', phone:'555-5678'}];
- $scope.showEdit = true;
- $scope.master = {};
- });
因为我们没有用到angular的bootstrap.这里,我们可以直接
- var app = angular.module('plunker',[]);
- <!DOCTYPE html>
- <html ng-app="plunker">
- <head>
- <meta charset="utf-8" />
- <title>AngularJS Plunker</title>
- <script>document.write('<base href="' + document.location + '" />');</script>
- <script data-require="angular.js@1.2.x" src="http://code.angularjs.org/1.2.13/angular.js" data-semver="1.2.13"></script>
- <script src="jquery-1.11.0.min.js"></script>
- <script src="ui-bootstrap-tpls-0.10.0.min.js"></script>
- <script src="bootstrap.js"></script>
- <script src="app.js"></script>
- <link rel="stylesheet" href="bootstrap.css" />
- <link rel="stylesheet" href="mycss.css" />
- </head>
- <body ng-controller="MainCtrl">
- <h2>Inline Edit</h2>
- <!--<input id="test" value="ddd"/>-->
- <table>
- <tr>
- <th>name</th>
- <th>phone</th>
- <th></th>
- </tr>
- <tr ng-repeat="employee in employees">
- <td>
- <input type="text" id='txt_name_{{employee.id}}' ng-model="employee.name" class="inactive" readonly />
- </td>
- <td> <input type="text" ng-model="employee.phone" class="inactive" readonly /></td>
- <td><edit ng-Model="employee" ng-show="showEdit"><a>Edit</a></edit>
- <update ng-Model="employee" ng-show="!showEdit"><a>Update</a></update>
- <cancel ng-Model="employee" ng-show="!showEdit"> | <a>Cencel</a></cancel>
- | <delete ng-Model="employee"><a>Delete</a></delete>
- </td>
- </tr>
- </table>
- </body>
- </html>
我们来看其中一个标签,<edit>,这里呢,我们用ng-Model来绑定employee这个对象。
这里,我们用angular的directive来对着三个标签进行事件的绑定。
angular的dirctive主要作用于DOM对象,而且他可以对Element Name (比如<edit></edit>) 对应于E:)、Attribute(比如<mytag edit=”express”></mytag> 对应于A、
Comment <!-- my comment –> 对应于M、Class <link class=”mycssclass”></link> 对应于C)。
默认对Attribute (A),
当我们有
app.directiv("edit", function(){
return{
restrict: "E",
. . . .
}
});
意思是说,我们要找到叫Element=”edit”的DOM对象,这里就是<edit>,
当然你也可以携程 restrict: “AE”,那意思就是说要找到Element或者attribute = edit的DOM对象
这里你可以随便对AEMC进行组合。
当你找到之后呢,就要对这个DOM进行操作,对于我们来说,就是对他绑定一个click的事件
- app.directive("edit", function(){
- return{
- restrict: "E",
- link: function(scope,element){
- element.bind("click",function(e){
- alert("I am clicked for editing");
- });
- }
- }
- })
这个时候呢,当你点Edit的时候呢,click事件就会触发。
再往下呢就是对edit click事件的延伸,我们要得到employee name的inputbox,然后对他进行css的转换,比如当你click edit后,应该出现inputbox的css的inactive或者active的调整,并且移除readOnly
这里要注意一件事,就是angular.copy,为什么使用angular.copy?这个是为后面的cancel做准备的,当你放弃修改的时候,你希望你的值恢复成原样,这个时候,对于angularJS来说,是要对model恢复原样。如何恢复修改之前的model?最简单的方法就是创建一个$scope.master = {}空的对象,然后在你click edit之后,马上把还没改变的model拷贝到这个空的master中去,把master作为一个临时的存储对象。
当我们click Edit之后,我们要隐藏Edit,而叫Update | Cancel出现。这个时候$scope.showEdit就用上了,在<edit>,<update>,<cancel>上面都有一个ng-show,这个flag用来指定这个元素是不是要显示。ng-show=”showEdit”这个值是绑定$scope.showEdit的。
- app.directive("edit", function(){
- return{
- restrict: "E",
- link: function(scope,element){
- element.bind("click",function(e){
- alert("I am clicked for editing");
- });
- }
- }
- })
下面,我们要给Update做事件的绑定。这里就没用什么可说的了。
- app.directive("update",function($document){
- return{
- restrict: 'AE',
- require: 'ngModel',
- link: function(scope,element,attrs,ngModel){
- element.bind("click",function(){
- alert(ngModel.$modelValue + " is updated, Update your value here.");
- var id = "txt_name_" +ngModel.$modelValue.id;
- var obj = $("#"+id);
- obj.removeClass("active");
- obj.addClass("inactive");
- obj.attr("readOnly",true);
- scope.$apply(function(){
- scope.showEdit = true;
- })
- })
- }
- }
- })
在下面就是Cancel了,上面说过了,Cancel的时候要还原之前的值,这个时候呢,我们就用angular.copy把当时临时存储的$scope.master拷贝回model去
- app.directive("cancel",function($document){
- return{
- restrict: 'AE',
- require: 'ngModel',
- link: function(scope,element,attrs,ngModel){
- element.bind("click",function(){
- scope.$apply(function(){
- angular.copy(scope.master,ngModel.$modelValue);
- //console.log(ngModel.$modelValue);
- })
- var id = "txt_name_" +ngModel.$modelValue.id;
- var obj = $("#"+id);
- obj.removeClass("active");
- obj.addClass("inactive");
- obj.prop("readOnly",true);
- scope.$apply(function(){
- scope.showEdit = true;
- })
- })
- }
- }
- });
最后就是Delete了,其实永远都要记住的事Angular是MVC,所以你这里你不用操心删除table行这样的事,只要删除model中emploee.id = @id就可以了
- app.directive("delete",function($document){
- return{
- restrict:'AE',
- require: 'ngModel',
- link:function(scope, element, attrs,ngModel){
- element.bind("click",function(){
- var id = ngModel.$modelValue.id;
- alert("delete item where employee id:=" + id);
- scope.$apply(function(){
- for(var i=0; i<scope.employees.length; i++){
- if(scope.employees[i].id==id){
- console.log(scope.employees[i])
- scope.employees.splice(i,1);
- }
- }
- console.log(scope.employees);
- })
- })
- }
- }
- });
基本上就完工了。这里我没有用任何现成的angular 插件,这只是对angular基本原理的阐述,如有误导或者有能简单的方法请指教。
AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除的更多相关文章
- 09Microsoft SQL Server 表数据插入,更新,删除
Microsoft SQL Server 表数据插入,更新,删除 向表中插入数据 INSERT INTO insert into tb1 values(0004,'张凤凤') insert into ...
- 09Oracle Database 数据表数据插入,更新,删除
Oracle Database 数据表数据插入,更新,删除 插入数据 Insert into table_name(column) values(values); insert into studen ...
- MYSQL数据插入、更新及删除
上文讲到创建数据表,本文介绍create table后的数据插入: 一.通过insert into ...values...插入 insert into tablename (column1,colu ...
- SQL Server索引进阶:第十三级,插入,更新,删除
在第十级到十二级中,我们看了索引的内部结构,以及改变结构造成的影响.在本文中,继续查看Insert,update,delete和merge造成的影响.首先,我们单独看一下这四个命令. 插入INSERT ...
- AngularJS进阶(十)AngularJS改变元素显示状态
AngularJS改变元素显示状态 前言 本文描述使用AngularJS提供的ng-show和ng-hide指令实现自动监听某布尔型变量来改变元素显示状态. 控制html元素显示和隐藏有n种方法:ht ...
- AngularJS进阶(二)AngularJS路由问题解决
AngularJS路由问题解决 遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去.再加一层地址解决了,但是后来发现问题还是来了: Could not resolve 'yhDtlMain ...
- AngularJS进阶(六)AngularJS+BootStrap实现弹出对话框
AngularJS+BootStrap实现弹出对话框 参考资料: http://angular-ui.github.io/bootstrap/#/modal https://www.zybuluo.c ...
- 如何用angularjs制作一个完整的表格之五__完整的案例
由于本人也是边学边写,因此整理的比较乱,下面放出我例子的完整代码,方便大家交流测试,如有问题欢迎评论 首先,表格采用的是BootStrap样式编辑的,主要使用的是angularjs,为了方便也有jQu ...
- angularJS进阶阶段(4)
angularJS进阶阶段(4) 编译器/$compile 编译器$compile是一个AngularJS的内置服务,它负责遍历DOM树来查找匹配指令, 并调用指令的实现代码进行处理. HTML编译包 ...
随机推荐
- 剑指Offer——知识点储备-JVM基础
剑指Offer--知识点储备-JVM基础 1.java内存与内存溢出 1.1 JVM分为哪些区,每一个区干嘛的?(见java虚拟机38页) (1)程序计数器(线程私有) 当前线程执行字节码的信号指示器 ...
- 好用的SQLAlchemy
准备 安装SQLAlchemy框架 测试代码 知识点剖析 引入库支持 基类和引擎 实体类 声明类 数据库自动完成 CRUD 总结 这里简单的记录一下本人第一次使用SQLAlchemy这个ORM框架的过 ...
- iOS中NSTimer的invalidate调用之后
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...
- FFmpeg示例程序合集-批量编译脚本
此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player: ...
- 开源项目——小Q聊天机器人V1.4
小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281 小Q聊天机器人V1.1 http://blog.csd ...
- 【安卓中的缓存策略系列】安卓缓存策略之磁盘缓存DiskLruCache
安卓中的缓存包括两种情况即内存缓存与磁盘缓存,其中内存缓存主要是使用LruCache这个类,其中内存缓存我在[安卓中的缓存策略系列]安卓缓存策略之内存缓存LruCache中已经进行过详细讲解,如看官还 ...
- java根据概率生成数字
/** * JAVA 返回随机数,并根据概率.比率 * @author zhanglei * */ public class MathRandom { /** * 0出现的概率为%50 */ publ ...
- 怎么在Eclipse中添加VI插件
下载地址 Vi插件下载位置 怎么安装? 将下载下来的zip文件进行解压,然后把对于的目录下的文件分别复制到eclipse目录下的plugins 和features目录下: 注册 在eclipse根目录 ...
- 汉字转拼音的Oracle函数
前言: 最近处理一个特殊的问题,需要用到汉字自动转换拼音的功能. 解决: 在这里找了不少资料,都是有所缺陷,而且也好像很绕.其实是一个很简单的东东.后来还是自己写了一个函数获取.分享出来,给有需要的X ...
- log4j 日志限制大小 拆分成30个 不按日期分日志 按大小拆分 按日期产生
先说一下按日期产生,不解释,大家都懂,这种方法的缺点就是很吃硬盘空间 log4j.rootLogger=INFO,logfile,stdout log4j.logger.java.sql=DEBUG, ...