Angular6: функция мемоизации с Lodash дает ошибку - PullRequest
0 голосов
/ 27 августа 2018

Ожидаемое поведение:

У меня есть канал, который принимает объект и тип, и он возвращает переменную этого объекта, в зависимости от того, какой тип. Я хочу запомнить эту функцию, поскольку она всегда должна возвращать одно и то же значение с одинаковыми параметрами. Канал должен возвращать строку из нескольких связанных сущностей.

Наблюдаемое поведение:

Выдается ошибка: 1007 *. Я использую этот метод в методе, который запоминается.

Код:

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 объекта, передает тип объекта (например, пользователя), и через (это необязательно, он используется, чтобы показать что-то еще в таблице данных, чем связанные сущности по умолчанию. Например: пользователь может создавать данные и показывать связанные разрешения вместо ролей). Затем он просто возвращает правильную переменную объекта linkCount в соответствии с типом.

1 Ответ

0 голосов
/ 27 августа 2018

Я думаю, что у вас есть проблема this здесь, а также проблема с концепцией memoize с точки зрения того факта, что вы передаете ему 3 параметра, когда он использует только первый по умолчанию для формирования map cache key.

Проблема this возникает из-за того, что по умолчанию momoize вызывается с этой привязкой запомненной функции .

См. Документацию _.memoize

По умолчанию первый аргумент, предоставленный запомненной функции: используется в качестве ключа кэша карты. Функция вызывается с этим связыванием запоминаемой функции.

...