Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';s angular的替代品。在angular中复制_Angular - Fatal编程技术网

什么';s angular的替代品。在angular中复制

什么';s angular的替代品。在angular中复制,angular,Angular,如何复制一个对象并丢失其在角度中的引用 在AngularJS中,我可以使用angular.copy(object),但在angular中使用它会出现一些错误 异常:参考错误:角度未定义 假设您使用的是ES6,您可以使用var copy=Object.assign({},original)。在现代浏览器中工作;如果您需要支持较旧的浏览器,请查看此 更新: 对于TypeScript 2.1+,ES6速记对象扩展符号可用: const copy={…original} 在我们找到更好的解决方案之前,您

如何复制一个对象并丢失其在角度中的引用

在AngularJS中,我可以使用
angular.copy(object)
,但在angular中使用它会出现一些错误

异常:参考错误:
角度
未定义


假设您使用的是ES6,您可以使用
var copy=Object.assign({},original)
。在现代浏览器中工作;如果您需要支持较旧的浏览器,请查看此

更新:

对于TypeScript 2.1+,ES6速记对象扩展符号可用:

const copy={…original}

在我们找到更好的解决方案之前,您可以使用以下方法:

duplicateObject = <YourObjType> JSON.parse(JSON.stringify(originalObject));
duplicateObject=JSON.parse(JSON.stringify(originalObject));
编辑:澄清

请注意:上述解决方案仅适用于Angular 2正在积极开发时提供的快速修复单衬套。我的希望是我们最终可能会得到一个相当于
angular.copy()
。因此,我不想编写或导入深度克隆库

此方法还存在解析日期属性的问题(它将成为字符串)


请不要在生产应用程序中使用此方法。仅在你的实验项目中使用它-你正在学习Angular 2的项目。

如bertandg所示使用lodash。angular不再具有此方法的原因是angular 1是一个独立的框架,外部库经常遇到angular执行上下文的问题。Angular 2没有这个问题,所以使用您想要的任何库


对于浅层复制,您可以使用Object.assign,这是ES6功能

let x = { name: 'Marek', age: 20 };
let y = Object.assign({}, x);
x === y; //false

不要将其用于深度克隆

如果要复制类实例,也可以使用Object.assign,但需要将新实例作为第一个参数传递(而不是{}):


正如其他人已经指出的,使用lodash或下划线可能是最好的解决方案。但是,如果您不需要这些库来做任何其他事情,您可能可以使用以下内容:

  function deepClone(obj) {

    // return value is input is not an Object or Array.
    if (typeof(obj) !== 'object' || obj === null) {
      return obj;    
    }

    let clone;

    if(Array.isArray(obj)) {
      clone = obj.slice();  // unlink Array reference.
    } else {
      clone = Object.assign({}, obj); // Unlink Object reference.
    }

    let keys = Object.keys(clone);

    for (let i=0; i<keys.length; i++) {
      clone[keys[i]] = deepClone(clone[keys[i]]); // recursively unlink reference to nested objects.
    }

    return clone; // return unlinked clone.

  }
功能深度克隆(obj){
//返回值为输入不是对象或数组。
if(typeof(obj)!='object'| | obj===null){
返回obj;
}
让我们克隆;
if(数组isArray(obj)){
clone=obj.slice();//取消数组引用的链接。
}否则{
clone=Object.assign({},obj);//取消对象引用的链接。
}
让keys=Object.keys(克隆);

对于(设i=0;i我发现的最简单的解决方案是:

let yourDeepCopiedObject = _.cloneDeep(yourOriginalObject);
*重要步骤: 您必须安装lodash才能使用此选项(其他答案不清楚):

然后将其导入ts文件:

import * as _ from "lodash";

深度复制包含嵌套对象的对象的替代方法是使用lodash的cloneDeep方法

对于Angular,您可以这样做:

  function deepClone(obj) {

    // return value is input is not an Object or Array.
    if (typeof(obj) !== 'object' || obj === null) {
      return obj;    
    }

    let clone;

    if(Array.isArray(obj)) {
      clone = obj.slice();  // unlink Array reference.
    } else {
      clone = Object.assign({}, obj); // Unlink Object reference.
    }

    let keys = Object.keys(clone);

    for (let i=0; i<keys.length; i++) {
      clone[keys[i]] = deepClone(clone[keys[i]]); // recursively unlink reference to nested objects.
    }

    return clone; // return unlinked clone.

  }
使用
纱线添加lodash安装lodash
npm安装lodash

在组件中,导入
cloneDeep
并使用它:

import { cloneDeep } from "lodash";
...
clonedObject = cloneDeep(originalObject);
您的构建只增加了18kb,这是值得的


我还写了一篇文章,如果你需要更深入的了解为什么要使用lodash的cloneDeep。

我需要这个功能,只需要从我的应用程序“模型”(原始后端数据转换为对象)开始。因此我最终使用了(从指定原型创建新对象)和(在对象之间复制属性)的组合。需要手动处理深度复制。我为此创建。

也有同样的问题,不想使用任何插件进行深度克隆:

static deepClone(object): any {
        const cloneObj = (<any>object.constructor());
        const attributes = Object.keys(object);
        for (const attribute of attributes) {
            const property = object[attribute];

            if (typeof property === 'object') {
                cloneObj[attribute] = this.deepClone(property);
            } else {
                cloneObj[attribute] = property;
            }
        }
        return cloneObj;
    }
静态深度克隆(对象):任意{

const cloneObj=(,请检查以下功能的例外情况

我已经创建了一个用于Angular 5或更高版本的服务,它使用angularjs的基础
Angular.copy()
,对我来说效果很好。此外,还有其他功能,如
未定义的
,等等。我希望能有所帮助。
像任何优化一样,很高兴知道。敬请

从'@angular/core'导入{Injectable};
@可注射({providedIn:'root'})
导出类角度服务{
私有类型的_数组_REGEXP=/^\[对象(?:Uint8 | uint8clipped | Uint16 | Uint32 | Int16 | Int32 | Float64)数组\$/;
私有stackSource=[];
私有stackDest=[];
构造函数(){}
公共isNumber(值:任意):布尔值{
if(typeof value==='number'){返回true;}
else{return false;}
}
公共isTypedArray(值:任意){
返回值&this.isNumber(value.length)和&this.TYPED_ARRAY_REGEXP.test(toString.call(value));
}
公共isArrayBuffer(对象:任何){
返回字符串调用(obj)='[object ArrayBuffer]';
}
public未定义(value:any){return typeof value=='undefined';}
public isObject(value:any){返回值!==null&&typeof值===='object';}
public isBlankObject(值:any){
返回值!==null&&typeof值==='object'&&!object.getPrototypeOf(值);
}
public isFunction(value:any){return typeof value==='function';}
公共setHashKey(obj:any,h:any){
如果(h){obj.$$hashKey=h;}
else{delete obj.$$hashKey;}
}
私有isWindow(obj:any){return obj&&obj.window===obj;}
私有isScope(obj:any){return obj&&obj.$evalAsync&&obj.$watch;}
私有copyRecurse(源:任意,目标:任意){
const h=目的地。$$hashKey;
if(Array.isArray(源)){
for(设i=0,ii=source.length;istatic deepClone(object): any {
        const cloneObj = (<any>object.constructor());
        const attributes = Object.keys(object);
        for (const attribute of attributes) {
            const property = object[attribute];

            if (typeof property === 'object') {
                cloneObj[attribute] = this.deepClone(property);
            } else {
                cloneObj[attribute] = property;
            }
        }
        return cloneObj;
    }
  copyFactory = (() ->
    resource = ->
      resource.__super__.constructor.apply this, arguments
      return
    this.extendTo resource
    resource
  ).call(factory)
let newObj = JSON.parse(JSON.stringify(obj))
 this.assignCustomerList = Object.assign([], this.customerList);
this.assignCustomer = Object.assign({}, this.customer);
npm install clone