Angular 2使用patchValue从REST API设置数据

时间:2017-04-05 20:00:28

标签: angular angular2-forms

我有一个表单和一些函数,如下所示。

  ngOnInit() {
        this.buildForm();
        this.loadData();
        this.success = false;
    }

    loadData(): void {
        this.countryService.getCountries().subscribe(list => {
            this.countries = new Select2Mapper('countryCode', 'name').getData(list);
            this.setDefaultCountry();
        });
    }

    setDefaultCountry(): void {
        console.log('Setting default country');
        console.log(this.accountCreateForm.get('company').value);
        this.accountCreateForm.get('company').patchValue({
            countryCode: "US"
        });
    }

    buildForm(): void {

        this.accountCreateForm = this.fb.group({
            company: this.fb.group({
                companyName: ['', [WPValidator.companyName]],
                countryCode: ['', [Validators.required]]
            }),
            administrative: this.fb.group({
                firstName: ['', [WPValidator.nameMandatory]]
            })
        });

        console.log('Form built');

        this.accountCreateForm.valueChanges
            .subscribe(data => this.onValueChanged(data));

        this.onValueChanged(); // (re)set validation messages now

    }

在上面的例子中,我可以看到在buildForm之后调用setDefaultCountry setDefaultTimeZone。我无法理解为什么新值会在UI中反映出来。我在UI中看到的只是完整的值列表。它没有显示补丁值。我是否需要在设置默认值之前或之后触发任何事件?

另外,当我在设置默认值,即patchValue后打印表单值时,我可以看到更新的值。

如果重要,我在select2 jquery插件上使用角度包装器进行国家/地区下拉

1 个答案:

答案 0 :(得分:0)

您需要导入changeDetectionRef并调用detectChanges()。

import {ChangeDetectorRef} from '@angular/core';

然后在课堂上,

constructor(private _cdr : ChangeDetectorRef){

}

稍后在_cdr.detectChanges()

之后致电patchValue()