【问题标题】:Wait until my FormlyFieldConfig has finished loading等到我的 FormlyFieldConfig 完成加载
【发布时间】:2018-08-06 18:43:12
【问题描述】:

我遇到了一个问题,我试图在 UI 元素完全加载之前使用它们,从而导致未定义的异常。

表单在组件构造函数中加载,然后我调用 initializeElements 方法来处理 UI 元素。但是,正如我所提到的,我得到了 null 和未定义的异常,因为我怀疑 loadForms() 方法在我去获取对象时没有完全完成。

我是 Angular 的新手,所以我不确定我可以在这里做什么来“等待”直到表单完全加载。我尝试将这些方法放在几个不同的生命周期挂钩中,但都没有成功。

我有我的组件:

export class UIComponent implements OnInit{
    form = new FormGroup({});
    model = {};
    fields: FormlyFieldConfig[];

    constructor(){
        this.fields = loadForm();

        this.initializeElements();
    };

    ngOnInit(){
    }; 


    initializeElements(){
        var overrides = this.form.get('Overrides'); // this is null on page load
        var firstNameObj = overrides.get('First Name'); // also null on page load
    };
}

我的组件模板:

<form fxLayoutAlign="center center" [formGroup]="form">
    <formly-form [form]= "form" [fields]="fields" [model]="model"></formly-form>
</form>

方法loadForms:

export function loadForms(){
    return [
               {
                   'key': 'Overrides',
                   'fieldGroup': [{
                   'fieldGroupClassName': 'display-flex',
                   'fieldGroup': [{
                                     'key': 'First Name',
                                     'type': 'input',
                                     'value': 'New First Name',
                                     'templateOptions':{
                                          'label': 'First Name: '
                                      }
                                 },
                                     'key': 'Last Name',
                                     'type': 'input',
                                     'value': 'New Last Name',
                                     'templateOptions':{
                                          'label': 'Last Name: '
                                     }
                                 }]
                    }]
               }
          ]
}

【问题讨论】:

    标签: javascript angular typescript angular-formly


    【解决方案1】:

    查看生命周期:https://angular.io/guide/lifecycle-hooks

    如果您在constructor() 方法中使用loadForms(),它不会等待视图加载。为此,如果您想确保视图完成加载,请使用ngAfterViewInit()

    如果可能,请不要在构造函数上加载数据或调用方法,根据需要使用ngOnInitngAfterViewInit() 或上面文档中列出的任何生命周期挂钩。

    我不知道您是否使用过它们,如果您尝试使用 ngAfterViewInit() 并不起作用,请尝试在您的 &lt;form&gt; 标签上设置 *ngIf=fields

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      你可以创建一个 observable

      export class UIComponent implements OnInit{
          form = new FormGroup({});
          model = {};
          overrides: any;
          firstNameObj: string = '';
          fields: FormlyFieldConfig[];
      
          constructor(){
          };
      
          ngOnInit(){
              loadForm().subscribe(
              response => {
                 this.fields = response;
                 this.initializeElements();
              }
          }; 
      
      
          initializeElements(){
              overrides = this.form.get('Overrides'); // this is null on page load
              firstNameObj = overrides.get('First Name'); // also null on page load
          };
      }
      

      那么您的导出功能将与此类似。我假设这是在它自己的文件中,所以应该是这样的可能会有一点差异。但如果这要从一个函数更改为 http 服务调用,那么 observable 应该保持不变。

      export function loadForms (): Observable<any> => {
        return new Observable<any>(observer =>{
          observer.next([
            {
              'key': 'Overrides',
              'fieldGroup': [{
                'fieldGroupClassName': 'display-flex',
                'fieldGroup': [{
                  'key': 'First Name',
                  'type': 'input',
                  'value': 'New First Name',
                  'templateOptions':{
                  'label': 'First Name: '
                  }
                },
                {
                  'key': 'Last Name',
                  'type': 'input',
                  'value': 'New Last Name',
                  'templateOptions':{
                    'label': 'Last Name: '
                  }
                }]
              }]
            }
        ]);
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 2015-08-11
        相关资源
        最近更新 更多