Справочная информация: существует довольно распространенная проблема, которая ранее поднималась в эта проблема github об ошибке инжектора при использовании UpgradeComponent
s внутри динамически загружаемых компонентов ввода. Я чувствую, что понимаю это достаточно хорошо и смог правильно ввести область действия, используя решение, аналогичное этому ответу:
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: Вот простое воспроизведение проблемы, включая мое исправление.