与特性请求相关的@angular/*包有哪些?
forms
描述
问题
目前,添加额外控件的唯一方法是使用诸如 addControl
在 FormGroup
或 insert
在 FormArray
上的方法。然而,这种方法为应用程序引入了显著的样板代码,因为它们必须完全管理自己的动态表单。这些是响应式表单对象,它们在其子控件上执行动态CRUD操作。此仓库中存在许多源于缺乏动态表单管理解决方案的问题,即可以自动管理其子项的表单。FormBuilder
是一个出色的工具,但它缺乏对控件的自动化CRUD操作。
建议的解决方案
为了解决这个问题,我们可以扩展 FormBuilder
并添加:
- 一个动态表单对象, Package
AbstractControl
,原因如下文进一步讨论 - 在
FormBuilder
上添加额外的方法auto
,该方法将接受一个模式并返回一个动态表单构建器。此模式主要表示自动创建的AbstractControl
的结构,包括初始化AbstractControl
所需的所有附加参数。
// data can be primitives or complex objects that adhere to the schema
type DynamicFormBuilder = (data: any) => AbstractControl
auto(DynamicFormSchema schema): DynamicFormBuilder
那么为什么不直接在 FormBuilder
上编写一个名为 auto
的标准递归方法呢?
这实际上有几个原因。首先是即时订阅的问题:
// common code in angular apps, won't work for a raw dynamic solution
const fb = new FormBuilder()
const control = fb.auto({})
const valueChanges$ = control.valueChanges.subscribe((value) => {/** Some operation */})
如果 auto
方法尚未创建控件,这可能会中断。因此,动态表单构建器(由 auto
返回)将输出适当的错误,因为它将用 _isCreated
Package valueChange
。
_isCreated: boolean = false
create(value: any) {
// check constrains, if any E.g. node count
// now do the recursion
this._isCreated = true
}
valueChanges(fn) {
if(!this._isCreated) throw Error('Control has not been initialized yet')
/** */
}
另一个问题是数据大小。将天文数字般的数组数据传递给创建动态 FormArray
可能会使页面变慢,这只会导致此仓库中出现更多问题。相反,我们会向动态表单添加约束,以限制可以放入 AbstractControl
树中的节点数量,并向开发人员提供一些建议,例如在他们的数据数组上引入分页功能。
性能如何?
如上所述,我们将向 auto
添加约束以处理这些常见情况,但递归本身是一个 O(n)
,其中 n
是传递给它的任何给定数据对象中的嵌套键的总数。
考虑过的替代方案
我愿意考虑其他方案,但我想不出任何
3条答案
按热度按时间3htmauhk1#
请注意,我们已经开始了针对您的功能请求的社区投票过程。距离投票过程结束还有20天。
有关Angular功能请求流程的更多详细信息,请参阅我们的文档。
ycggw6v22#
感谢您提交您的功能请求!看起来在投票过程中,它没有收集到足够的票数进入下一阶段。
我们希望保持Angular丰富且符合人体工程学,同时关注其范围和学习过程。如果您认为您的请求可能超出了Angular的范围,我们鼓励您与community合作,将其发布为开源项目package。
您可以在我们的文档中找到有关功能请求过程的更多详细信息。
wwtsj6pe3#
我们同意动态表单可以使用一些爱。我们标记这个规范,因为我们知道这里需要设计工作。