Angular6:Lodash的记忆功能出现错误

时间:2018-08-27 09:35:50

标签: angular lodash angular6 memoization

预期行为:

我有一个接受对象和类型的管道,并根据该类型返回该对象的变量。我想记住此函数,因为它应始终返回具有相同参数的相同值。管道应返回包含多个链接实体的字符串。

观察到的行为:

抛出错误,说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对象的正确变量。

1 个答案:

答案 0 :(得分:0)

我认为您在这里有一个this问题,以及memoize的概念问题,因为当它仅使用第一个参数时,您将3个参数传递给它默认形成map cache key

this问题来自于以下事实:默认情况下,momoize是通过记忆功能的此绑定调用的。

See the _.memoize documentation

  

默认情况下,提供给记忆功能的第一个参数是   用作地图缓存键。使用this绑定调用func   记忆功能的功能。