在自定义反应式表单控件上禁用设置会导致超出最大调用堆栈大小

时间:2019-05-13 09:40:31

标签: angular custom-controls angular-reactive-forms

我在Angular项目中构建了一个自定义输入控件。一切正常,除非我将disable属性设置为true,否则setDisabledState上会发生一些无限循环,从而导致

preview-4adb70f742b91f09679fb.js:1 ERROR RangeError: Maximum call stack size exceeded
    at eval (model.ts:1519)
    at eval (model.ts:1531)
    at eval (model.ts:1493)
    at Array.forEach (<anonymous>)
    at FormGroup._forEachChild (model.ts:1493)
    at FormGroup._reduceChildren (model.ts:1530)
    at FormGroup._reduceValue (model.ts:1518)
    at FormGroup._updateValue (model.ts:1505)
    at FormGroup.AbstractControl.updateValueAndValidity (model.ts:575)
    at FormControl.AbstractControl._updateAncestors (model.ts:533)

我创建了一个显示问题的Stackblitz:https://stackblitz.com/edit/angular-n34zrj

我是否在设置内部FormControl的Disabled属性方面缺少某些东西(使用diabled(),enabled())?

如果是这样,请让我知道如何解决此问题。在头上砸了几个小时。

2 个答案:

答案 0 :(得分:0)

在代码中,您可以通过根据布尔setDisabledState()参数设置禁用状态来强制执行循环。在此方法中,您调用disable()/ enable(),它们将自己调用setDisabledState()。

client = paramiko.client.SSHClient()
client.connect(...)                       # use your connection parameters here
sftp = client.open_sftp()
remote_files = [x.filename for x in sorted(sftp.listdir_attr(), key = lambda f: f.st_mtime)]

https://netbasal.com/angular-custom-form-controls-made-easy-4f963341c8e2

尝试类似Netanel Basal的方法:

| Sort-Object Pattern -Unique

答案 1 :(得分:0)

如果您使用 Severin Klugs 回答中所述的错误,通过停止不必要的调用但在应用函数之前检查它们是否相同来修复

setDisabledState?(isDisabled: boolean): void {
    if(isDisabled == this.control.disabled) return;
    isDisabled ? this.control.disable() : this.control.enable();
}