常见问题

path

有许多方法都需要传递 path 参数,它使用 / 分隔符来表示访问表单对象路径,例如一个 JSON Schema 示例:

  1. schema: SFSchema = {
  2. properties: {
  3. app: {
  4. type: 'string',
  5. title: 'APP',
  6. },
  7. user: {
  8. type: 'object',
  9. properties: {
  10. name: {
  11. type: 'string',
  12. },
  13. age: {
  14. type: 'number',
  15. },
  16. }
  17. },
  18. }
  19. };

以下 path 行为都有效:

  • /app

  • /user/name

使用 / 开头时表示从根路径查找,反之从当前路径向下查找。

为什么非实时校验部分自定义校验无法生效?

由于非实时校验(设置 liveValidate:false)不会重新对每个元素执行一次校验,虽然能做到,但自定义校验有可能存在异步,无法保证执行的顺序,因此非实时校验实际只对 JSON Schema 本身的校验。

如何动态使用 Schema?

一般分为两种情形:

1、Schema 定义后可能受限于某个数据来自远程

  1. @ViewChild('sf', { static: false }) sf: SFComponent;
  2. schema: SFSchema = {
  3. properties: {
  4. app: {
  5. type: 'string',
  6. title: '附属应用',
  7. ui: 'select',
  8. enum: []
  9. }
  10. }
  11. };
  12. ngOnInit() {
  13. this.http.get('/apps').subscribe((res: any) => {
  14. this.schema.properties.app.enum = res;
  15. this.sf.refreshSchema();
  16. });
  17. }

2、远程 Schema

  1. schema: SFSchema = {
  2. properties: {}
  3. };
  4. ngOnInit() {
  5. this.http.get('/schema').subscribe((res: any) => this.sf.refreshSchema(res));
  6. }

什么时候使用 default?

Schema 的 default 用于设置初始化,一般情况下当修改表单时是需要提供 formData 参数,但对于增加表单来说,应该依靠 default 提供一个更友好的表单给用户。

如何刷新特定 Schema?

可以通过 getProperty 方法来获取某个 Schema 的属性,其属性包含 Schema 数据以及 Ui 数据,可以修改这些数据,并重新调用小部件的 reset 方法重新渲染该 Schema,例如:

  1. const statusProperty = this.sf.getProperty('/status')!;
  2. statusProperty.schema.enum = ['1', '2', '3'];
  3. statusProperty.widget.reset('2');