Задать вопрос
splincodewd
@splincodewd
Developer

Возможно ли динамически загрузить модули в Angular 2+ без знания о его reference?

Мой дубликат:
https://stackoverflow.com/questions/44734387/how-t...

База данных хранит URL-адрес, который должен загружать модуль из каталога «dist».

{
  "personal-area": "js/compile-module.js",
  "product": "js/compile-module2.js"
}


Application example:
localhost:8282/#/personal-area

Затем приложение лениво (async | dynamic | any) загружает модуль из:
localhost:8282/js/compile-module.js

Модули предварительно скомпилированы заранее и на этапе создания основного приложения они не участвуют, поэтому у меня нет путей к источникам угловых модулей. В файле с маршрутизацией (app.routers.ts) я сохраняю обработчик компонента, который извлекает из базы данных путь к файлу модуля на сервере (на основе URL-адреса).

export const ROUTES: Routes = [

    {
        path: '**',
        component: WorkspaceOutletComponent
    },

];


В основном обработчике есть метод, который пытается загрузить модуль, но по причинам, которые я не понимаю, я не знаю, как заставить Angular подключить скомпилированный модуль для орла и работать.

@Component({ ... })
export class WorkspaceOutletComponent {

    constructor() {
    }

    ngOnInit() {
        // detect routing and exec init
    }

    public init(workSpaceUrl: string, workSpacePathModule: string) {
        console.log(`url: ${workSpaceUrl} path: ${workSpacePathModule}`)();

        this.router.resetConfig([
            {
                path: workSpaceUrl, loadChildren: workSpacePathModule
            }
        ]);

        this.router.navigate([workSpaceUrl])
            .then(() => console.log('Navigate to'))
            .catch((e) => console.error('Error', e));
    }

}


Приложение создается с помощью webpack 2. Но в тот момент, когда я заменяю маршрутизацию, он записывает мне ошибку, и я даже не знаю, где копать, чтобы динамически загружать модуль (который мне нужно получить из базы данных), я делаю Не знаю ссылки на модуль во время сборки, ничего, у меня даже нет исходных кодов, поэтому мне нужны сторонние модули для загрузки во время выполнения. Что я делаю не так?

b209b00da29048b9a19ee2708919900b.png

Если я использую SystemJS. Это также не помогает, он пытается загрузить модуль с диска (из источника).

this.router.resetConfig([
            {
                path: workSpaceUrl, loadChildren: SystemJS.import(workSpacePathModule).then(function (m) {
                    console.log(m);
                })
            }
        ]);


5ce87a0f03fc4cd1aed83cbf7b212e6f.png

Тут кое-что нашел:
https://github.com/angular/angular-cli/issues/4234...

Правильно ли я понимаю, что для Angular нужно точное имя, чтобы он составил hash-map ключ-значение. И поэтому нельзя передавать так как я это делаю, но что тогда мне делать, если я не знаю, соответствий между путем на диске (так как у меня нет исходников)?
  • Вопрос задан
  • 301 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Посмотрите вот это https://github.com/mgechev/angular-seed/issues/1358, если я правильно вас понял - это то, что нужно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы