Есть ли стандартный способ заставить AngularJS определять начальные значения UpgradeComponent при его динамической загрузке?

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

export const ScopeProvider = {
  deps: ['$injector'],
  provide: '$scope',
  useFactory: scopeFunction,
};

export function scopeFunction(i: any) {
  const newScope = i.get('$rootScope').$new();

  // special property to differentiate this scope from the one coming
  // from the injector that is not used for dynamically loaded components
  newScope.dynamicScope = true;

  return newScope;
}

Я определенно хотел бы знать, есть ли в этом решении подводные камни, о которых я не знаю, в отличие от решение для инжектора, упомянутое в выпуске github.

Однако это не моя главная забота. Меня больше всего беспокоит то, что даже с правильными Injector и Scope у UpgradeComponent все еще есть проблема, когда начальные значения компонента не обнаруживаются angularjs, потому что $digest не происходит после того, как компонент получает созданный. Возможно, это конкретно проблема с загрузчиком компонентов в ngx-bootstrap, а не общая проблема с angular, но на данный момент я не уверен. Исправление, которое я придумал на данный момент, состоит в том, чтобы вызвать Scope.$evalAsync() в конце конструктора для UpgradeComponent, но я не уверен, что это правильный путь, поэтому я задаю этот вопрос.

Это пример логики моего исправления:

export class Testng1ComponentFacade extends UpgradeComponent implements OnInit {

  constructor(elementRef: ElementRef, injector: Injector) {
    super(testng1Component.selector, elementRef, injector);

    const injectorScope = injector.get('$scope');
    if(injectorScope.dynamicScope) {
      console.log('calling $evalAsync() for UpgradeComponent');
      injectorScope.$evalAsync(() => {});
    }
  }

}

Я как бы основывал его на этот угловой код.

TL;DR: Вот простое воспроизведение проблемы, включая мое исправление.


person CShark    schedule 22.11.2019    source источник