代码之家  ›  专栏  ›  技术社区  ›  Nicke Manarin

链接方法时无法读取未定义的属性

  •  0
  • Nicke Manarin  · 技术社区  · 3 年前

    我尝试使用一个扩展方法来比较列表,该方法调用比较器,如下所示:

    type HasDiff<T> = (object: T, row: any) => boolean;
    
     export const isListEqualToRows = <T>(objects: T[], rows: any[], hasDiffFunction: HasDiff<T>): boolean => {
      if (objects.length !== rows.length)
        return true;
    
      return rows.every((row, index) => {
        const object = objects[index];
    
        if (row.isNew) {
          return false;
        }
    
        return !hasDiffFunction(object, row);
      });
    };
    

    比较是由Angular的值以反应形式更改触发的,不确定是否相关,但以下是:

    import { isListEqualToRows } from '@core/helpers';
    
    formGroup.valueChanges.pipe(debounceTime(debounceValue)).subscribe((changes) => {
      this.areChangesDetected = !isListEqualToRows<Person>(this.items, changes, this.hasDiff);
    });
    

    我的问题是,对于一个对象,我在一个列表中有一个列表。所以我想打电话给 isListEqualToRows() 方法再次在内部:

    hasDiff(item: Person, row: any): boolean {
      return item.description !== row.description
        || !isListEqualToRows<Address>(item.addresses, row.addresses, this.hasDiffAddress);
    }
    
    hasDiffAddress(item: Address, row: any): boolean {
      return item.AddressId !== row.id
        || item.AddressStreet !== row.street;
    }
    

    但我最后在运行第二行时出现了这个错误 hasDiff() 方法:

    无法读取未定义的属性(读取'hasDiffAddress')

    如何解决这个问题?

    0 回复  |  直到 3 年前
        1
  •  1
  •   CherryDT Ravi Shankar    3 年前

    你在打电话吗 hasDiff 没有将其绑定到正确的 this 对象由于已启用严格模式,因此 那个 哈斯迪夫 是指当在 someObject.hasDiff(...) 那么语法就是 undefined (如果没有严格模式,它将是全局对象)。

    而不是通过 this.hasDiff isListEqualToRows ,你也需要通过 this.hasDiff.bind(this) (item, row) => this.hasDiff(item, row) .

    或者,添加一个 thisArg 争论 IslisteQualtorrows 你经过哪里 从调用方的作用域,然后调用 hasDiffFunction hasDiffFunction.call(thisArg, object, row) 而不是 hasDiffFunction(object, row) .

    另见: How does the "this" keyword work?