Вызовы функций не поддерживаются в декораторах, но был вызван 'checkIfIsOnDomain' - PullRequest
0 голосов
/ 28 марта 2020

Я получаю сообщение об ошибке всякий раз, когда запускаю ng build Angular 8:

ERROR in Error during template compile of 'HomeModule'
  Function calls are not supported in decorators but 'checkIfIsOnDomain' was called.

Как я могу это исправить? Мне нужно загрузить другой набор маршрутов в зависимости от того, находится ли пользователь на поддомене или нет. Код отлично работает на ng serve.

const routes: Routes = [
  {path: '', component: HomeComponent}
];

@NgModule({
  declarations: [
    HomeComponent,
  ],
  imports: [
    RouterModule.forChild(RouterService.checkIfIsOnDomain() ? routes : RouterService.getSubdomainRoutes('../..')),
  ],
  exports: [
  ],
})

Код в RouterService:

static checkIfIsOnDomain() {
    const full = window.location.host;
    const parts = full.split('.');
    let result = true;
    if (parts[0] && parts[1] && parts[2]) {
      result = false;
      (window as any).Intercom('update', {
        'hide_default_launcher': true
      });
    }
    return result;
  }

  static getSubdomainRoutes(path) {
    return [
      { path: '', loadChildren: `${path}/website/website.module#WebsiteModule` }
    ];
  }

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Вы можете загрузить все маршруты и с помощью CanActivate решить, может ли пользователь (или должен иметь возможность) посетить ваш "сайт", если он находится в домене или поддомене. Если вы хотите оптимизировать его, вы можете создать несколько модулей и импортировать их лениво.

1 голос
/ 28 марта 2020

Angular Компилятор выполняет маршруты статически. Angular компилятор не запускает ваш код. Компилятор Angualr работает в контексте nodejs; следовательно, он не знает, что такое window.location.host, потому что это не браузер. Angular Компилятор только смотрит на определения маршрутов и принимает решение о том, как связать ваш код. Например, если вы определите лениво загруженные модули, он разделит модуль на другой файл.

Вы не можете использовать функцию для генерации определений маршрутов. Я бы предложил два способа решения этой проблемы.

Вы можете преобразовать свое приложение в рабочую область (я предполагаю, что вы используете Angular CLI). Здесь у вас может быть два приложения: одно для domain.com, а другое для sub.domain.com. Любой общий компонент вы можете иметь их в проекте lib. Вы можете прочитать больше: https://angular.io/guide/workspace-config

Другой способ - использовать динамический c модуль загрузки. Вы создаете модуль для каждого domain.com и sub.domain.com. Каждый модуль будет определять маршруты статически. После этого, используя динамическую загрузку c, вы можете написать код, чтобы выбрать, какой модуль загрузить на основе текущего маршрута. Модуль загрузки Dynami c является расширенной версией c. Вы можете узнать больше об этом здесь: https://medium.com/angular-in-depth/dynamically-loading-components-with-angular-cli-92a3c69bcd28

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...