У меня очень большое гибридное приложение Angular; исходное приложение angularjs 1.6.8, а остальные Angular 7.2.15. Мы работаем над преобразованием всего приложения в Angular, но оно идет медленно. Наше приложение также опирается на angular -ui- bootstrap (2.5.0) / ngx- bootstrap (3.1.3).
Каждый из наших важных просмотров загружается лениво, за исключением целевой страницы. В настоящее время я пытаюсь преобразовать одно из этих представлений.
Наш модуль приложения импортирует ModalModule.forRoot()
. Это работает хорошо, пока я не попытаюсь получить к нему доступ в устаревшем сервисе. Например, у меня есть маршрут с именем «Учетная запись» с именем службы AccountModalService
, с созданием этого рейтинга:
import angular from 'angular';
import { downgradeInjectable } from '@angular/upgrade/static';
import { AccountModalService as service } from './accountModal.service';
angular.module('account').factory('AccountModalService', downgradeInjectable(service));
Теперь из моего angularjs AccountPage
я могу открыть модал, подобный этому
const accountPage = {
controller: AccountPageCtrl,
template: `<div><button ng-click="test()">Test</button></div>`
};
AccountPageCtrl.$inject = [
'AccountModalService'
];
function AccountPageCtrl(AccountModalService) {
this.test = function test() {
AccountModalService.openTestModal(); // this would open my test modal
};
}
angular.
module('account').
component('accountPage', accountPage);
Я знаю, что модал работает, когда метод openTestModal
вызывается из компонента Angular, но когда я пытаюсь запустить его из компонента angularjs. Я получаю ошибку
angular.js:14800 Error: StaticInjectorError(AppModule)[AccountModalService]:
StaticInjectorError(Platform: core)[AccountModalService]:
NullInjectorError: No provider for AccountModalService!
Если я изменяю AccountModalService
на root инжектор, например @Injectable({ provideIn: 'root' })
, я получаю ошибку, указывающую, что инжектор не может найти компонент, который модальный предназначен для отображения:
angular.js:14800 Error: No component factory found for TestModalComponent. Did you add it to @NgModule.entryComponents?
at noComponentFactoryError (core.js:9877)
...
TestModalComponent
- это entryComponent
из загруженных ленивых AccountModule
, и этот модуль импортирует мой загруженный общий модуль. Но, конечно же, TestModalComponent
не является entryComponent
из AppModule
.
Если я переместлю свой тестовый модальный компонент и этот сервис в загруженный код, он будет правильно открывать модальный. Тем не менее, это только первый шаг в превращении загруженного модуля в монолит. Это не шаблон, который я хочу продолжить, поскольку он делает лениво загруженные маршруты бесполезными.
Есть ли способ понизить сервис angular, который использует ngx- bootstrap модальный BsModalService
, чтобы показать модальный с angularjs код в ленивом загруженном маршруте? Кто-нибудь успешно делал что-то подобное, кто готов поделиться как?