首页 > 解决方案 > Angular6:使用 Lodash 的记忆功能会出错

问题描述

预期行为:

我有一个管道,它接受一个对象和一个类型,它返回该对象的一个​​变量,具体取决于哪种类型。我想记住这个函数,因为它应该总是用相同的参数返回相同的值。管道应返回由多个链接实体组成的字符串。

观察到的行为:

抛出一个错误,说this.getDefaultEntityTypeForLinkedEntities is not a function. 我在被记忆的方法中使用了这个方法。

代码:

export class LinkCountPipe implements PipeTransform {

  public transform(linkCount: LinkCount, type: EntityType, via: EntityType): string {
    const memoGetLinkCount = _.memoize(this.getLinkCount);
    const result = memoGetLinkCount(linkCount, type, via);
    return result ? result.toString() : undefined;
  }

  public getLinkCount(linkCount: LinkCount, type: EntityType, via: EntityType): number {
    const someType = via ? via : this.getDefaultEntityTypeForLinkedEntities(type);
    switch (someType) {
      case EntityType.APPLICATION:
        return linkCount.nbApplications;
      case EntityType.ENTITLEMENT:
        return linkCount.nbEntitlements;
      case EntityType.PERMISSION:
        return linkCount.nbPermissions;
      case EntityType.ROLE:
        return linkCount.nbRoles;
      case EntityType.USER:
        return linkCount.nbUsers;
    }
  }

  public getDefaultEntityTypeForLinkedEntities(type: EntityType) {
    return DatatableSettings.getDefaultEntityTypeForLinkedEntities(type);
  }
}

澄清:

我在应用程序中使用实体。每个实体都链接到其他类型的实体(我有用户、角色、权限……)。每个实体对象都包含一个从服务器获取的 linkCount 对象,它包含例如用户的链接角色、权利和应用程序。在我的 HTML 中,我使用:element.linkCount | linkcount: type : via. linkcount 纯管道用于更好的性能。它应该做的事情如下:它接受实体的 linkCount 对象,它传递实体的类型(例如用户)和一个 via(这是可选的,它用于在数据表中显示其他内容,而不是默认链接实体。例如:用户数据表并显示链接权限而不是角色)。然后它只根据类型返回 linkCount 对象的正确变量。

标签: angularlodashangular6memoization

解决方案


我认为您在this这里遇到了问题,并且memoize在默认情况下仅使用第一个参数来形成map cache key.

this问题在于默认情况下momoize是使用memoized 函数的 this 绑定调用的。

请参阅 _.memoize 文档

默认情况下,提供给 memoized 函数的第一个参数用作地图缓存键。func 是通过 memoized 函数的 this 绑定调用的。


推荐阅读