Как я могу использовать приложение Angular в дочерних маршрутах другого приложения Angular?

Я хотел бы загрузить приложение Angular с помощью отложенной загрузки (когда пользователи выбирают определенный маршрут) в другое приложение Angular. Должен ли я скомпилировать первое приложение, чтобы его можно было использовать во втором, или как?

Routing-Module приложения для вложения в приложение Angular:

const upgradeRoutes: Routes = [
  {
    path: '/upgrade',
    component: HelloComponent
  },
  { path: '', redirectTo: '/upgrade', pathMatch: 'full' }
];

@NgModule({
  imports: [
    RouterModule.forChild(upgradeRoutes)
  ],
  exports: [
    RouterModule
  ],
  declarations: []
})
export class UpgradeRoutingModule { }

Модуль приложения для вложения в приложение Angular

@NgModule({
  declarations: [
    AppComponent,
    HelloComponent
  ],
  imports: [
    CommonModule,
    UpgradeRoutingModule
  ],
  exports: [
    UpgradeModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class UpgradeModule { }

Модуль приложения, в котором я хочу использовать (с ленивой загрузкой) первый, описанный в дочерних маршрутах:

import {UpgradeModule} from '../../node_modules/module-upgrade/src/app/app.module'  

@NgModule({
   declarations: [
     ...
   ],
   import: [ UpgradeModule ]
});

1) Я хотел бы понять, правильно ли это, и/или есть ли другой способ сделать это.

2) Еще одна проблема заключается в том, что дочернее приложение использует Angualr 6, тогда как второе/основное приложение использует Angular 4.


person Donovant    schedule 02.07.2018    source источник


Ответы (1)


Либо:

  • Не загружайте свое дочернее приложение и не используйте его в качестве подмодуля (для этого требуется обновить основное приложение до Angular 6, что требует как минимум рефакторинга вызовов операторов RxJS и, возможно, некоторых других незначительных вещей),
  • Или просто настройте свой веб-сервер для обслуживания вашего дочернего приложения по определенному URL-адресу. В этом случае ваши два приложения не смогут совместно использовать какое-либо состояние (кроме глобального пространства имен, файлов cookie и localStorage) или Angular Component/Service/Directive/Pipe.
person Guerric P    schedule 02.07.2018
comment
вы также можете взглянуть на angular.io/guide/elements - но, конечно, это совсем не прямой подход - person Ovidiu Dolha; 02.07.2018
comment
Но как я могу загрузить внешний модуль (приложение Angular), чтобы использовать его в своем приложении, когда пользователь переходит по определенному URL-адресу? - person Donovant; 03.07.2018
comment
Вы должны включить свое дочернее приложение в сборку основного приложения, следуя этому руководству: angular.io/guide/ lazy-loading-ngmodules, но ваше дочернее приложение не будет загружено и не сможет работать как отдельное приложение - person Guerric P; 03.07.2018
comment
Я хотел бы запустить это вспомогательное приложение в дочернем маршруте, делая что-то подобное { path: 'specific', loadChildren: 'app.module' } - person Donovant; 03.07.2018
comment
да, это вполне возможно, я имею в виду, что вы не сможете загрузить только дочернее приложение, потому что оно будет зависеть от основного приложения - person Guerric P; 03.07.2018
comment
Я сделал то, что указано в этом URL-адресе, но получаю сообщение об ошибке Произошла ошибка при статическом разрешении значений символов. Вызовы функций не поддерживаются. Рассмотрите возможность замены функции или лямбды ссылкой на экспортированную функцию (позиция 194:50 в исходном файле .ts), разрешив символ NgModule в /Users/username/Dev/Work/Essence/upgrade-module/node_modules/@angular/ core/core.d.ts, разрешающий символ UpgradeModule в /Users/username/Dev/Work/Essence/upgrade-module/src/app/app.module.ts, разрешающий символ UpgradeModule в /Users/username/Dev/Work/ Essence/upgrade-module/src/app/app.module.ts - person Donovant; 03.07.2018
comment
В вашем объявлении @NgModule должна быть ошибка. Если вам нужна помощь в создании ленивых модулей, я предлагаю вам написать новый вопрос с соответствующими деталями. - person Guerric P; 03.07.2018
comment
Но я думал, что это был главный вопрос - person Donovant; 03.07.2018
comment
Давайте продолжим обсуждение в чате. - person Guerric P; 03.07.2018