如何在 Angular -2/4 中删除双向数据绑定

Posted

技术标签:

【中文标题】如何在 Angular -2/4 中删除双向数据绑定【英文标题】:How to Remove Two Way Data Binding in Angular -2/4 【发布时间】:2017-12-01 09:05:12 【问题描述】:

我正在 Angular 中开发一个多选下拉菜单,它也有搜索功能。那是当我通过我的主数据解析从输入字段给出的输入并仅在 DOM 中显示过滤后的内容时。这是我的功能:

modifyFilter(value: any) 
        console.log('value', value); //The value passed from DOM
        this.filterContent = this.catalogManufacturerNames; /******/
        for(let i=0; i<this.catalogManufacturerNames.length;i++) 
         /* Search catalogManufacturerNames for the value and splice all
         filterContent not having the matching value */    
        
    

代码的问题是,每次调用modifyFilter 方法时,catalogManufacturerNames 也会随着filterContent 一起更改。因此,每次我调用modifyFilter 时,由/******/ 标记的行filterContent 被分配给前一个filterContent,而不是全局且可能未更改的catalogManufacturerNames。我认为问题在于filterContentcatalogManufacturerNames 有两种方式绑定,但我不知道如何根据我的要求进行修改。或者有没有其他方法可以解决它。欢迎提出建议。

【问题讨论】:

【参考方案1】:

在这种情况下,您必须使用 Object.assignDeepCopy。它将创建您的对象/变量的副本,因此当您对主要对象执行任何过滤器时,它不会反映在复制的对象中,反之亦然。

您可以根据需要使用,[]

用于单个对象

[]: 用于对象集合

let copiedItem = Object.assign(, copiedItem , PrimaryItem );

详情请参考:https://developer.mozilla.org/en/docs/Web/javascript/Reference/Global_Objects/Object/assign

选项:2 深拷贝

DeepCopy(obj: any): any 
  let clonedObject;

  if (obj === null || typeof obj !== 'object') 
    return obj;
  
  if (obj instanceof Array) 
    clonedObject = [];
    for (let i = 0; i < obj.length; i++) 
      clonedObject[i] = this.deepCopy(obj[i]);
    
    return clonedObject;
  
  if (obj instanceof Date) 
    clonedObject = new Date(obj.valueOf());
    return clonedObject;
  
  if (obj instanceof RegExp) 
    clonedObject = RegExp(obj.source, obj.flags);
    return clonedObject;
  
  if (obj instanceof Object) 
    clonedObject = new obj.constructor();
    for (const attr in obj) 
      if (obj.hasOwnProperty(attr)) 
        clonedObject[attr] = this.deepCopy(obj[attr]);
      
    
    return clonedObject;
  

从组件调用

let copiedItem: any[] = this.DeepCopy(PrimaryItem );

【讨论】:

哇!有效。它满足了我的需求并且运行良好。有没有其他技术含量较低的方法,比如=比这个简单吗? 我的意思是= 分配比Object.assign 简单得多,对吧?我想知道是否有任何捷径可以让语法更简单。 是的,你说得对,用=赋值比object.assign简单,但是直接赋值不仅复制对象,还复制引用 我从 Mozilla 文档中了解到,感谢您。但是没有更简单的选择吗? 如果是这样你可以试试,“让copyedItem = primaryItem.slice(0);”不过不确定代码质量/最佳实践。【参考方案2】:

作为使用Object.assign 的更简单的替代方法,您可以使用扩展运算符将双重绑定对象的属性复制到另一个对象:

this.filterContent = ...this.catalogManufacturerNames;

参考: http://redux.js.org/docs/recipes/UsingObjectSpreadOperator.html

【讨论】:

您建议的方法在编译打字稿时会抛出错误。【参考方案3】:

假设如果您有一个名为“a”的变量,其值为“apple”和名为“b”的变量,您想要为其分配一个值“a”,并且您不希望“b”的任何未来更改影响"a" 然后只需使用下面的代码

var b=Object.assign(a); //这将停止双向绑定,这意味着b的任何变化都不会影响a

【讨论】:

以上是关于如何在 Angular -2/4 中删除双向数据绑定的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 @Input - 如何从父组件绑定子组件的 ID 属性?

Angular自定义组件实现数据双向数据绑定

angular.js 中同步视图和模型数据双向绑定,$watch $digest $apply 机制

Angular 手动实现ngModal数据双向绑定

js 一对多 双向绑定器

React中双向数据绑定基本原理