zoukankan      html  css  js  c++  java
  • angularJs——利用深拷贝angular.copy()实现取消编辑功能(编辑前保存之前数据,取消后恢复原始数据)

    参考:https://www.it1352.com/200163.html

       https://blog.csdn.net/Sourcecode_poet/article/details/53509856?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

    一.  理解深拷贝与浅拷贝:

    例:  

    var a=1,b;
    b=a;
    b++;
    console.log("a,"+a);  //a,1
    console.log("b,"+b);  //b,1
    /////////////////////
    var c=[1,2,3],d;
    d=c;
    d.splice(0,1);
    console.log("c,"+c);  //c,[2,3]
    console.log("d,"+d);  //d,[2,3]
    /////////////////////
     var e={
     name:"Jill",
     age:20
     },f;
     f=e;
     f.name="Donny";
     f.age=32;
     console.log("e,"+angular.toJson(e,true)); //e,{name:Donny,age:32}
     console.log("f,"+angular.toJson(f,true)); //f,{name:Donny,age:32}

      深拷贝:把一个变量x的值赋给另一个变量y,并修改另一个变量的值y,不会影响前一个变量x的情况。如a和b,引用不同的内存地址,所以改变其中一个的值,并不会影响另一个。
       浅拷贝:把一个变量x的值赋给另一个变量y,修改后者y的值,同时一起影响了前者x的值的情况。如c和d,e和f。引用同一块内存地址,其中一个变量修改了这个内存地址中的值,另一个变量再次访问这块内存地址时,得到的也是修改后的值。


      Javascript中基本数据类型变量的相互赋值是使用深拷贝执行的,而像数组和对象这种复杂数据类型,使用的则是浅拷贝。

    二. 实例——点击“+”时新增,点击“-”时删除,点击“取消”恢复:

    html:

    <form id="keywordsForm" name="fieldForm" class="am-form am-form-horizontal">
        <div style=" 100%;">
            <div>
                <div ng-show="keysList.length<1" class="am-form-group am-u-sm-12 am-margin-top line-keyword">
                    <div class="am-u-sm-12 am-text-center">
                        <button class="am-btn am-btn-warning" ng-click="addKeyword()" style="color: white; cursor: pointer; margin-top: 2rem;">
                            添加关键字</button></div>
                </div>
                <div ng-show="keysList.length>=1" ng-repeat="data in keysList track by $index" class="am-form-group am-u-sm-12 am-margin-top line-keyword">
                    <div class="am-u-sm-12">
                        <label class="am-u-sm-2 am-form-label"><span style="color: red"> *</span>关键字{{$index+1}} :</label>
                        <div class="am-u-sm-8">
                            <select class="am-u-sm-2" style=" 20%;" ng-model="data.ztype" ng-options="m.code as m.value for m in matchways">
                            </select> <input type="text" style=" 80%;" class="am-u-sm-10" placeholder="关键字" ng-model="data.words"
                             data-validation-message="请填写关键字" required />
                        </div>
                        <div class="am-u-sm-2" style="padding-top: 0.6em;">
                            <i ng-show="keysList.length==1||keysList.length==($index+1)" style="color: #ccc;" ng-click="addKeyword()" class="am-icon-sm am-icon-plus-circle pointer am-margin-right"></i>
                            <i ng-show="$index>0" style="color: #ccc;" ng-click="deleteKeyword($index)" class="am-icon-sm am-icon-minus-circle pointer"></i>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="form-actions" ng-if="keysList.length>=1" style="text-align: center; padding-bottom: 1%">
            <button type="submit" class="am-btn am-btn-warning" style="color: white; cursor: pointer; margin-top: 2rem;">保&nbsp;存</button>
            &nbsp;&nbsp;&nbsp;&nbsp; <a href="javascript:;" class="am-btn" ng-click="cancelKeywords()" style="color: white;background: buttonface; margin-top: 2rem;">取&nbsp;消</a>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <a href="#/list" class="am-btn am-btn-success" style="margin-top: 2rem;">返&nbsp;回</a>
        </div>
    </form>

    js:

    var slist = new Array();
    $scope.keysList = new Array();
    
    $http({
        method : 'get',
        params : {},
        data : {},
        url : ***
    }).success(function(response, status, headers, config) {
        var rstate = response.result;
        if (rstate == "0") {    
            var _data = response.message;
            $scope.keysList = _data.keysList; //可编辑数据
            slist = angular.copy(_data.keysList); //保存原始数据, 关键语句,进行深拷贝
        }else{
            alert('fail: ' + response.error);
        }
    }).error(function(response, status, headers, config) {    
        alert('error: ' + response.error);
    });
    
    $scope.matchways = [{code:'1',value:'半匹配'},{code:'2',value:'全匹配'}]; // 关键字匹配类型
    //添加关键字
    $scope.addKeyword = function(){
        var len =$scope.keysList.length;
        len++;
        $scope.keysList.push({id:'',ztype:'1',words:''});
    }
    //删除关键字
    $scope.deleteKeyword = function(i){
        $scope.keysList.splice(i,1);
        $scope.$digest();
    }
    
    $scope.cancelKeywords = function(){
        if(slist.length >= 1){
            $scope.keysList = angular.copy(slist);//关键语句,进行深拷贝
        }else{
            $scope.keysList = [];
        }
    }
  • 相关阅读:
    POJ 2533 Longest Ordered Subsequence(裸LIS)
    HDU 1159 Common Subsequence(裸LCS)
    HDU 1160(两个值的LIS,需dfs输出路径)
    HDU 1260 Tickets (普通dp)
    HDU 2859 Phalanx(对称矩阵 经典dp样例)
    2018年暑假ACM个人训练题7 题解报告
    HDU 1060 Leftmost Digit(求N^N的第一位数字 log10的巧妙使用)
    HDU 1071 The area(求三个点确定的抛物线的面积,其中一个点是顶点)
    HDU 1077 Catching Fish(用单位圆尽可能围住多的点)
    HDU 1099 Lottery (求数学期望)
  • 原文地址:https://www.cnblogs.com/linjiangxian/p/12487383.html
Copyright © 2011-2022 走看看