Как настроить NGRX / Data для компиляции AOT - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть стандартная настройка из документов данных NGRX с одним объектом. Все работает с JIT, но когда я делаю AOT, я получаю следующее сообщение об ошибке:

...
Function expressions are not supported in decorators in 'entityConfig'
'entityConfig' references 'ɵ0'
...
Consider changing the function expression into an exported function.

Моя конфигурация объекта:

const entityMetadata: EntityMetadataMap = {
  Identifiers: {}
};

export const entityConfig = {
  entityMetadata
};

Мой модуль:

...
import { entityConfig } from './store/entity-metadata';

@NgModule({
  imports: [CommonModule, EntityDataModule.forRoot(entityConfig)]
})
...

здесь выдается ошибка: EntityDataModule.forRoot(entityConfig)

Версии:

"@angular/core": "^8.1.1",
"@ngrx/data": "^8.6.0",
"@ngrx/store": "^8.6.0",

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Проблема может быть решена с помощью EntityDefinitionService следующим образом:

import { EntityDefinitionService } from '@ngrx/data';
import { entityMetadata } from './store/entity-metadata';

@NgModule({
  imports: [CommonModule]
})
export class NotLazyLoadedFeatureModule {
  constructor(private eds: EntityDefinitionService) {
    eds.registerMetadataMap(entityMetadata);
  }
}

Но EntityDefinitionService ожидает EntityMetadataMap напрямую, без оборачивания его в объект.

export const entityMetadata: EntityMetadataMap = {  -> Use this
  Identifiers: {}
};

/* export const entityConfig = {  -> Not needed anymore
  entityMetadata
};*/

Стоит отметить, что у меня есть магазин, разделенный на несколько модулей. Технически они не загружаются лениво, но мой app-store.module.ts выглядит так:

@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    StoreModule.forRoot({}),
    EffectsModule.forRoot([]),
    EntityDataModule.forRoot({}), <- Only needed once
    NotLazyLoadedFeatureModule, <- Import not lazy loaded modules here
    StoreDevtoolsModule.instrument()
  ]
})
export class AppStoreModule {}

Подробное объяснение разницы между JIT и AOT:
https://gist.github.com/chuckjaz/65dcc2fd5f4f5463e492ed0cb93bca60

1 голос
/ 03 апреля 2020

это известная проблема, если вы используете редуктор в качестве функции стрелки. Прочтите эту часть: https://ngrx.io/guide/store/reducers#creating -the-reducer-function

Примечание. Экспортированная функция редуктора необходима, поскольку вызовы функций не поддерживаются компилятором AOT.

Вы должны обернуть каждый редуктор правильной функцией javascript.

...