动态表单使用场景
您可能需要一个灵活的表单,可以根据用户选择或服务返回的信息进行重新配置,例如添加或删除input元素组,添加或删除select元素组。
在这种情况下,如果从一开始就在模板中写入所有表单,然后使用单个ngif树结构进行选择控制,则程序将变得冗长。
这个时候。 程序优选能够基于用户选择或服务器响应自动生成所需的表单。 这就是动态表单要处理的业务。
与组件生成相关的概念组件的两种配置
要动态生成表单,必须了解组件是如何生成的。
一个angular组件由两部分组成。
Wrapper
Wrapper可以与组件进行交互,并在Wrapper初始化完成后实例化了组件。 它还负责组件的change检测以及触发挂接函数,如ngOnInit和ngOnChanges。
视图
View可以负责呈现模板、呈现组件外观,并触发Wrapper更改检测。 一个组件可以包含多个view,每个view都可以通过调用angular提供的两个函数自己生成和销毁。 这个过程不涉及顶级视图。
的常规加载方法(非动态加载方法)
通常,在根组件或另一个组件中嵌入组件进行使用。 嵌入的组件称为子组件,嵌入的组件称为父组件。 现在,编译子组件代码后,将生成组件工厂的组件工厂。 这是angular核心类的组件工厂的实例。 它还由在父“组件”视图中生成组件的dom节点和生成该组件的WritView负责
动态加载组件
如果尝试在组件的视图中插入动态组件,则无法获取此动态组件的实例,因为它是由非动态组件编译器完成的。
实现动态组件
angular提供了几个函数来解决上述问题。 要使用这些函数,必须注入两个对象。
构造器(
privatecomponentfactoryresolver : componentfactoryresolver,
privateviewcontainerref 3360 viewcontainerref、
() )。
}
我们注入了ComponentFactoryResolver和ViewContainerRef。
ComponentFactoryResolver使用一种方法“resolvecomponenent”,该方法将组件类作为参数接收,并生成基于该组件类的组件工厂,即前面提到的组件工厂
ViewContainerRef提供了一种将组件工厂作为参数接收并在视图中生成子组件的方法“createComponent ()”。 (我个人的理解是,我处理了主机视图所做的事情,并生成了组件的wrapper和view。)
实现动态表单
上面简要介绍了实现动态组件的一些技术,现在让我们考虑一下如何创建动态表单。
具体的想法
我们想建立独立的动态表单模块。 如果您想使用动态表单,可以轻松部署此模块,稍加配置即可使用。
本模块完成后,我们希望从顶级用户的角度来看,这是一个这样的工作流程。
可以轻松创建具有输入属性的组件。 问题的核心是这个组件如何根据输入属性生成所需的表单。
这意味着它本身是调用ComponentFactoryResolver和ViewContainerRef来动态生成组件,还是交给其他人?
下图是实现想法。
实际上,将动态表单拆分为较小的动态组件,在不预先加载的情况下,外部组件充当容器,所有动态组件都以合适的服装生成和销毁,他们共同构成了动态表单。 调用ComponentFactoryResolver和ViewContainerRef生成组件的部分逻辑未集成到外部容器中,而是传递给自定义命令和ng-container。 因为指令没有视图,所以他通过注入ViewContainerRef获取了主机的视图容器。 由于不渲染ng容器,因此检索到的视图容器是外部组件容器的视图容器。
该处理的优点相当于动态组件本身管理各个分割后的动态组件,而不用在外部组件上统一管理。
外部组件容器如下所示:
configs是用户的配置数据,自定义命令驻留在ng-container中,根据config渲染每个动态组件,但ng-container是透明的。
看看代码目录的结构,最后是这样的
以上是大致的实现思路,具体来说,开头提到的两篇文章有很多值得关注的细节,阐述得很详细。