我正在尝试通过从https://github.com/eclipsesource/jsonforms-angular-seed.git运行示例应用程序来使用https://www.npmjs.com/package/@jsonforms/angular-material
示例应用程序不使用路由,但它的设置非常复杂,例如在应用程序模块定义中使用构造函数。我也尝试遵循几乎相同的方法来满足我的需求,所以结果是这样的:
import {APP_INITIALIZER, NgModule} from '@angular/core';
import { CommonModule } from '@angular/common';
import {HttpClient, HttpClientModule} from '@angular/common/http';
import { RouterModule } from '@angular/router';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
import { NgxPaginationModule } from 'ngx-pagination';
import { SharedModule } from '../../shared/shared.module';
import {DynamicFormComponent, SchemaEditorDialog} from './dynamic-form.component';
import { DynamicFormData } from './dynamic-form.data';
import {JsonFormsAngularService, JsonFormsModule} from '@jsonforms/angular';
import {Actions, UISchemaElement, setLocale} from '@jsonforms/core';
import { forkJoin } from 'rxjs';
import { parsePhoneNumber } from 'libphonenumber-js';
import { resolveRefs } from 'json-refs';
import AJV from 'ajv';
import { initialState } from './store';
import data from './data';
import {JsonFormsAngularMaterialModule} from '@jsonforms/angular-material';
import {BrowserModule} from '@angular/platform-browser';
export const routes = [
{ path: '', component: DynamicFormComponent, pathMatch: 'full' }
];
export const loadCore = (jsonformsService: JsonFormsAngularService, http: HttpClient): () => Promise<void> => {
return () => {
const ajv = new AJV({
schemaId: 'auto',
allErrors: true,
jsonPointers: true,
errorDataPath: 'property'
});
ajv.addFormat('time', '^([0-1][0-9]|2[0-3]):[0-5][0-9]$');
ajv.addFormat('tel', maybePhoneNumber => {
try {
parsePhoneNumber(maybePhoneNumber, 'DE');
return true;
} catch (_) {
return false;
}
});
return forkJoin({
uischema: http.get('./assets/uischema.json'),
schema: http.get('./assets/schema.json')
}).toPromise().then(result => {
const { schema, uischema } = result;
return resolveRefs(schema)
.then(
(res: any) => {
jsonformsService.updateCore(
Actions.init(
data,
res.resolved,
uischema as UISchemaElement,
ajv as any
)
);
}
);
});
};
};
@NgModule({
imports: [
CommonModule,
HttpClientModule,
RouterModule.forChild(routes),
FormsModule,
ReactiveFormsModule,
InMemoryWebApiModule.forRoot(DynamicFormData, {delay: 500}),
NgxPaginationModule,
SharedModule,
JsonFormsModule,
JsonFormsAngularMaterialModule,
BrowserModule
],
declarations: [
DynamicFormComponent,
SchemaEditorDialog
],
schemas: [],
providers: [
{
provide: APP_INITIALIZER,
useFactory: loadCore,
deps: [JsonFormsAngularService, HttpClient],
multi: true
}
]
})
export class DynamicFormModule {
constructor(jsonformsService: JsonFormsAngularService) {
jsonformsService.init(initialState.jsonforms);
jsonformsService.updateLocale(setLocale('de-DE'));
}
}
然后我在 Javascript 控制台中得到了这个:
ERROR Error: Uncaught (in promise): ReferenceError: Cannot access 'DynamicFormModule' before initialization
ReferenceError: Cannot access 'DynamicFormModule' before initialization
谷歌说这是因为循环依赖。但是,我检查了自己,模块托管的组件很简单:
@Component({
selector: 'app-configurations',
templateUrl: './dynamic-form.component.html',
styleUrls: ['./dynamic-form.component.scss'],
encapsulation: ViewEncapsulation.None,
providers: [ DynamicFormService ]
})
export class DynamicFormComponent implements OnInit {
public users: FilledFormListItemDto[];
public searchText: string;
public page: any;
public settings: Settings;
schema: any;
uiSchema: any;
data: any;
constructor(private appSettings: AppSettings,
private dialog: MatDialog){
this.settings = this.appSettings.settings;
}
我做错了什么?有什么我可以做的让它更简单,或者可能是另一个示例项目来参考?