AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除

分享一下我老师大神的人工智能教程!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

AngularJS实现表格数据的编辑,更新和删除

效果

 

实现

首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据


  
  
  1. var app = angular.module('plunker', ['ui.bootstrap']);
  2. app.controller('MainCtrl', function($scope) {
  3. $scope.name = 'World';
  4. $scope.employees =[{id:101, name:'John', phone:'555-1276'},
  5. {id:102, name:'Mary', phone:'800-1233'},
  6. {id:103,name:'Mike', phone:'555-4321'},
  7. {id:104,name:'Adam', phone:'555-5678'},
  8. {id:105,name:'Julie', phone:'555-8765'},
  9. {id:106,name:'Juliette', phone:'555-5678'}];
  10. $scope.showEdit = true;
  11. $scope.master = {};
  12. });

因为我们没有用到angularbootstrap.这里,我们可以直接


  
  
  1. var app = angular.module('plunker',[]);
  2. <!DOCTYPE html>
  3. <html ng-app="plunker">
  4. <head>
  5. <meta charset="utf-8" />
  6. <title>AngularJS Plunker </title>
  7. <script> document.write('<base href="' + document.location + '" />'); </script>
  8. <script data-require="[email protected]" src="http://code.angularjs.org/1.2.13/angular.js" data-semver="1.2.13"> </script>
  9. <script src="jquery-1.11.0.min.js"> </script>
  10. <script src="ui-bootstrap-tpls-0.10.0.min.js"> </script>
  11. <script src="bootstrap.js"> </script>
  12. <script src="app.js"> </script>
  13. <link rel="stylesheet" href="bootstrap.css" />
  14. <link rel="stylesheet" href="mycss.css" />
  15. </head>
  16. <body ng-controller="MainCtrl">
  17. <h2>Inline Edit </h2>
  18. <!--<input id="test" value="ddd"/>-->
  19. <table>
  20. <tr>
  21. <th>name </th>
  22. <th>phone </th>
  23. <th> </th>
  24. </tr>
  25. <tr ng-repeat="employee in employees">
  26. <td>
  27. <input type="text" id='txt_name_{{employee.id}}' ng-model="employee.name" class="inactive" readonly />
  28. </td>
  29. <td> <input type="text" ng-model="employee.phone" class="inactive" readonly /> </td>
  30. <td> <edit ng-Model="employee" ng-show="showEdit"> <a>Edit </a> </edit>
  31. <update ng-Model="employee" ng-show="!showEdit"> <a>Update </a> </update>
  32. <cancel ng-Model="employee" ng-show="!showEdit"> | <a>Cencel </a> </cancel>
  33. | <delete ng-Model="employee"> <a>Delete </a> </delete>
  34. </td>
  35. </tr>
  36. </table>
  37. </body>
  38. </html>

我们来看其中一个标签,<edit>,这里呢,我们用ng-Model来绑定employee这个对象。

这里,我们用angulardirective来对着三个标签进行事件的绑定

angulardirctive主要作用于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 = editDOM对象

这里你可以随便对AEMC进行组合。

当你找到之后呢,就要对这个DOM进行操作,对于我们来说,就是对他绑定一个click的事件


  
  
  1. app.directive("edit", function(){
  2. return{
  3. restrict: "E",
  4. link: function(scope,element){
  5. element.bind("click",function(e){
  6. alert("I am clicked for editing");
  7. });
  8. }
  9. }
  10. })

这个时候呢,当你点Edit的时候呢,click事件就会触发。

再往下呢就是对edit click事件的延伸,我们要得到employee nameinputbox,然后对他进行css的转换,比如当你click edit后,应该出现inputboxcssinactive或者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的。


  
  
  1. app.directive("edit", function(){
  2. return{
  3. restrict: "E",
  4. link: function(scope,element){
  5. element.bind("click",function(e){
  6. alert("I am clicked for editing");
  7. });
  8. }
  9. }
  10. })

下面,我们要给Update做事件的绑定。这里就没用什么可说的了。


  
  
  1. app.directive("update",function($document){
  2. return{
  3. restrict: 'AE',
  4. require: 'ngModel',
  5. link: function(scope,element,attrs,ngModel){
  6. element.bind("click",function(){
  7. alert(ngModel.$modelValue + " is updated, Update your value here.");
  8. var id = "txt_name_" +ngModel.$modelValue.id;
  9. var obj = $("#"+id);
  10. obj.removeClass("active");
  11. obj.addClass("inactive");
  12. obj.attr("readOnly",true);
  13. scope.$apply(function(){
  14. scope.showEdit = true;
  15. })
  16. })
  17. }
  18. }
  19. })

在下面就是Cancel了,上面说过了,Cancel的时候要还原之前的值,这个时候呢,我们就用angular.copy把当时临时存储的$scope.master拷贝回model


  
  
  1. app.directive("cancel",function($document){
  2. return{
  3. restrict: 'AE',
  4. require: 'ngModel',
  5. link: function(scope,element,attrs,ngModel){
  6. element.bind("click",function(){
  7. scope.$apply(function(){
  8. angular.copy(scope.master,ngModel.$modelValue);
  9. //console.log(ngModel.$modelValue);
  10. })
  11. var id = "txt_name_" +ngModel.$modelValue.id;
  12. var obj = $("#"+id);
  13. obj.removeClass("active");
  14. obj.addClass("inactive");
  15. obj.prop("readOnly",true);
  16. scope.$apply(function(){
  17. scope.showEdit = true;
  18. })
  19. })
  20. }
  21. }
  22. });

最后就是Delete了,其实永远都要记住的事AngularMVC,所以你这里你不用操心删除table行这样的事,只要删除modelemploee.id = @id就可以了


  
  
  1. app.directive("delete",function($document){
  2. return{
  3. restrict:'AE',
  4. require: 'ngModel',
  5. link:function(scope, element, attrs,ngModel){
  6. element.bind("click",function(){
  7. var id = ngModel.$modelValue.id;
  8. alert("delete item where employee id:=" + id);
  9. scope.$apply(function(){
  10. for(var i=0; i <scope.employees.length; i++){
  11. if(scope.employees[i].id==id){
  12. console.log(scope.employees[i])
  13. scope.employees.splice(i,1);
  14. }
  15. }
  16. console.log(scope.employees);
  17. })
  18. })
  19. }
  20. }
  21. });

基本上就完工了。这里我没有用任何现成的angular 插件,这只是对angular基本原理的阐述,如有误导或者有能简单的方法请指教。

这里写图片描述

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/mm2zzyzzp/article/details/83239180
今日推荐