Могу ли я понизить версию в загруженном модуле ModalService от Valor Software ngx- bootstrap? - PullRequest
0 голосов
/ 27 января 2020

У меня очень большое гибридное приложение 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 код в ленивом загруженном маршруте? Кто-нибудь успешно делал что-то подобное, кто готов поделиться как?

...