Что такое декоратор @SkipSelf в Angular?

Декоратор @SkipSelf сообщает DI искать зависимость во всем дереве, начиная с родительского инжектора.

Я наткнулся на декоратор @SkipSelf, как показано ниже. Что делает этот @SkipSelfдекоратор, что именно имеется в виду в данном случае?

      class Dependency {}

@Injectable()
class NeedsDependency {
  constructor(@SkipSelf() public dependency: Dependency) { this.dependency = dependency; }
}

const parent = ReflectiveInjector.resolveAndCreate([Dependency]);
const child = parent.resolveAndCreateChild([NeedsDependency]);
expect(child.get(NeedsDependency).dependency instanceof Dependency).toBe(true);

const inj = ReflectiveInjector.resolveAndCreate([Dependency, NeedsDependency]);
expect(() => inj.get(NeedsDependency)).toThrowError();

1 ответ

Решение

Начнем построчно:

Первый случай:

A. Создайте родительский инжектор и добавьте к нему:

      const parent = ReflectiveInjector.resolveAndCreate([Dependency]);

B. Создайте дочерний инжектор и добавьте к нему, поскольку он предоставляется в родительском инжекторе, структура DI может разрешать зависимости ()

      const child = parent.resolveAndCreateChild([NeedsDependency]);

Второй случай:

A. Создайте одиночный инжектор и добавьте к нему оба &:

      const inj = ReflectiveInjector.resolveAndCreate([Dependency, NeedsDependency]);

Б. На этот раз разрешение зависимостей не удастся из-за @SkipSelf() применяется к, структура DI будет игнорировать Dependency экземпляр в inj инжектор, и попробуйте найти в иерархии поставщика, который удовлетворяет этой несуществующей зависимости, поэтому inj.get(NeedsDependency) выдаст ошибку как NeedsDependency не может быть решен.

      expect(() => inj.get(NeedsDependency)).toThrowError();
Другие вопросы по тегам