在Angular7应用程序中使用ComponentFactoryResolver是个好主意吗?

时间:2019-06-03 15:28:14

标签: angular angular7 angular-components

我想创建一个角度为7(前端)的Web应用程序,以动态加载不同类型的组件,例如本例 https://angular.io/guide/dynamic-component-loader

但是我不确定使用template <class Archive, class T, typename std::enable_if<std::is_base_of<Artifact,T>::value>::type* = nullptr> void serialize(Archive &ar, std::shared_ptr<T>& artifact, unsigned int version) { ... } 是否是个好主意。 我从没用过,也不知道它是否稳定以及性能如何。

如果有人知道替代方案,我希望您对此发表意见。 我不想使用ComponentFactoryResolver

谢谢!

2 个答案:

答案 0 :(得分:4)

是的,最好使用ComponentFactoryResolver,这就是正式文档中的原因。自Angular 2起,它就位于内部,非常稳定。对性能没有重大影响。

许多Angular库在内部也使用Angular Material library。 检查Portal inside the Component Development Kit (CDK)及其source in GitHub,您可以在其中看到它用于在其中显示动态内容。

关于您的问题,最好是使用NgSwitch还是使用ComponetFactoryResolver来创建组件,这很难回答,因为这取决于您要尝试执行的操作,而您并未解释确切的含义场景。我要说的是,在大多数情况下,您应该使用ComponentFactoryResolver,因为它允许您动态添加任何组件,并且对于所有可能的动态组件,您都没有一个带有巨大NgSwitch的大组件。仅在您的动态组件数量很少且您不希望添加新组件的情况下,使用NgSwitch创建它们可能会更容易。

答案 1 :(得分:2)

作为先前答案的补充,为了更好地比较这两种方法,可能需要添加每种情况下发生的情况的一些详细信息。

使用 FactoryResolver 服务“创建”组件的步骤:

  1. 使用resolveComponentFactory()实例化组件类 方法:此方法将组件类型作为参数,并且 寻找相应的“组件工厂”。
       Nb:组件工厂是Angular为每个声明的组件创建的类,用于实例化新组件
  2. 使用createComponent()将新组件“附加”到视图 ViewContainerRef类的方法

有关信息: https://angular.io/guide/dynamic-component-loader#resolving-components

结构指令 ngIfngSwitch ...)“创建”组件时应用的步骤:

  1. 指令使用提供的模板创建嵌入式视图。 为此,它还使用ViewContainerRef类( createEmbeddedView()方法。
  2. 如果此视图包含组件选择器Angular 实例化一个新的组件类,也使用相应的 工厂,它将添加到视图中。

=>这两种方法大致都经过相同的步骤(实际上,“结构指令”方法增加了一个步骤,即创建嵌入式视图,我认为这是可以忽略的)。

因此,我认为,从两个选项中选择一个的最有价值的原因是用例,我将总结如下:

结构指令ngIfngSwitch ...):

         
  • 当组件很少时很有用

FactoryResolver服务:

         
  • 避免使用一长串的组件(如上一个答案中所述)
  •      
  • 更好的关注点分离(模板或父组件可能不需要知道可能实例化的所有组件的列表)
  •      
  • 需要延迟加载动态组件(有关更多信息,我建议这样做:https://blog.angularindepth.com/here-is-what-you-need-to-know-about-dynamic-components-in- angular-ac1e96167f9e)