【问题标题】:Angular 2 disable/enable reactive form element on loadAngular 2在加载时禁用/启用反应表单元素
【发布时间】:2017-08-17 08:25:24
【问题描述】:

我有一个动态响应式表单组件。你向它传递一组字段,它就会构建一个表单。

当我有一个复选框元素控制同一表单中的另一个元素是启用还是禁用时,我的问题就出现了。当控制复选框被更改时,我更新同级元素没有问题,但是当加载视图时,我得到了很好的旧 ExpressionChangedAfterItHasBeenCheckedError 错误(显然只在开发中)

public ngOnInit() {
    // If the element is a field controller subscribe to it's value changes
    if (this.elementVal.isFieldController === true) {
        // This is what's causing the issue
        this.toggleControlledFields(this.form.get(this.elementVal.key).value);
        this.form.get(this.elementVal.key).valueChanges
            .subscribe((data) => {
                console.log(data, 'the data');
                this.toggleControlledFields(data);
            });
    }
}

fieldController 可以控制一个或多个值,因此我循环遍历每个值并禁用或启用它控制的字段:-

public toggleControlledFields(value) {
    if (value === '' || value === false) {
        this.elementVal.fieldsToControl.forEach((field) => {
            this.form.get(field).disable();
        });
    } else {
        this.elementVal.fieldsToControl.forEach((field) => {
            this.form.get(field).enable();
        });
    }
}

因为我这样做onInit 我收到了错误消息,所以我尝试添加detectChanges() 并且尝试了不同的生命周期挂钩,但我终生无法解决问题。任何帮助将不胜感激。

【问题讨论】:

    标签: angular


    【解决方案1】:

    所以我添加了带有检测更改的以下生命周期挂钩,这似乎解决了我的问题,也许这对其他人有帮助..

    constructor(private cd: ChangeDetectorRef) {}
    
    public ngAfterViewInit() {
        this.cd.detectChanges();
    }
    

    【讨论】:

    • 节省了我的一天——尤其是当 DOM 元素的更新依赖于内部验证机制时!!! THX
    • 很高兴它帮助了你:)
    • 我正在禁用 ctor 中的一个字段(即它从未启用过 - 只是在那里显示该字段;我在加载数据之前就这样做了),我似乎必须这样做即使在加载数据或表单后动态更改启用/禁用不是问题,您所说的也可以避免错误。这太疯狂了。我一定是做错了什么,对吧??这不能是设计使然...
    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2018-03-13
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多