1. 程式人生 > >AngularJS進階(十一)AngularJS實現表格資料的編輯,更新和刪除

AngularJS進階(十一)AngularJS實現表格資料的編輯,更新和刪除

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

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基本原理的闡述,如有誤導或者有能簡單的方法請指教。

這裡寫圖片描述