Angular2 中的动态模板“嵌入”

2024-01-09

我正在努力实现这样的目标: 我有一个名为的模型类ObjectTypeA, ObjectTypeB and ObjectTypeC。 还有一个工厂ComponentFactory,根据传入的对象类型将创建不同的组件:

ComponentFactory.ts

export interface ComponentFactoryInterface {

    static CreateComponent(obj: CommonSuperObject)

}

@Injectable()
export class ComponentFactory {

    public static CreateComponent(obj: CommonSuperObject){

        if (obj instanceof ObjectTypeA){
            return ObjectComponentA()
        }else if (obj instanceof ObjectTypeB){
            return ObjectComponentB()
        }

    }
}

在模板中我想做这样的事情:

main_template.html

<components>
  <component *ngFor="#obj in objects">
     <!-- insert custom component template here -->
  </component>
</components>

如何动态插入关联的组件?

我可以做这样的事情(不是我喜欢的方式):

<components>
  <!-- loop over component models -->
  <custom-component-a *ngIf="models[i] instanceof ObjectTypeA">
  </custom-component-a>
  <custom-component-b *ngIf="models[i] instanceof ObjectTypeB">
  </custom-component-b>
</components>

但这在很多层面上对我来说似乎都是错误的(如果我添加另一个组件类型,我将不得不修改此代码和工厂代码)。

编辑 - 工作示例

constructor(private _contentService: ContentService, private _dcl: DynamicComponentLoader, componentFactory: ComponentFactory, elementRef: ElementRef){

    this.someArray = _contentService.someArrayData;
    this.someArray.forEach(compData => {
    let component = componentFactory.createComponent(compData);
        _dcl.loadIntoLocation(component, elementRef, 'componentContainer').then(function(el){
            el.instance.compData = compData;
        });
    });

}

update

DCL 已被弃用一段时间了。使用ViewContainerRef.createComponent反而。有关示例(使用 Plunker),请参阅Angular 2 动态选项卡,带有用户单击选择的组件 https://stackoverflow.com/questions/36325212/angular-2-dynamic-tabs-with-user-click-chosen-components/36325468#36325468

original

您可以使用ngSwitch(类似于您自己的解决方法,但更简洁)或DynamicComponentLoader

See also

  • https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html
  • 如何在ES6中使用Angular2 DynamicComponentLoader? https://stackoverflow.com/questions/33034930/how-to-use-angular2-dynamiccomponentloader-in-es6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular2 中的动态模板“嵌入” 的相关文章

随机推荐

  • 为什么 std::fill(0) 比 std::fill(1) 慢?

    我观察到一个系统std fill在一个大的std vector
  • 如何在 JAX-WS 中添加响应标头?

    我有一个与此类似的方法 WebMethod public BeanResponse generar WebParam header true mode Mode INOUT name auditoria partName auditoria
  • 如何使用 RSpec 针对真实应用程序开发 Rails3 引擎?

    关于引擎开发以及使用虚拟应用程序进行测试的文章已经有很多 在我们的例子中 我们开发的引擎不是独立的实体 而是依赖于真实的 Rails 3 应用程序 我们仍然希望此代码存在于引擎中 而不是成为应用程序的一部分 因为引擎的工作是从拥有自己的表和
  • 按名称选择特定打印机 VB

    我制作了一个程序 该程序将在启动时运行 要求用户选择他们的默认打印机 该代码显示组合框中所有已安装的打印机 提交按钮会将组合框中选择的打印机设置为该用户的默认打印机 有没有办法只显示包含特定文本的打印机名称 例如 ABC printer1A
  • Python正则表达式选择所有不匹配模式的元素

    我昨天问了类似的问题保留 pandas 系列中带有模式的元素 而不将其转换为列表 https stackoverflow com questions 64958329 keep elements with pattern in pandas
  • Python:如何在 Windows 资源管理器上打开文件夹(Python 3.6.2、Windows 10)

    如果我将要打开的路径存储在名为 Finalpath 的字符串中 如下所示 2 8 电影 英语 虎胆龙威系列 那么我如何在 Windows 资源管理器中打开它 Windows 10 Python 3 6 2 P S 我知道很多人问过这个问题
  • 如何在 Android 中将字节数组写入文件?

    这是我创建文件的代码 public void writeToFile byte array try String path data data lalallalaa txt FileOutputStream stream new FileO
  • WordPress 自定义帖子类型搜索结果页面

    我设置了一个自定义搜索表单来搜索和显示自定义帖子类型的结果 形式为
  • next-auth 中 useSession() 的“加载”返回值是什么?

    我正在编写一个 Next js 项目 并使用 GitHub 和实现身份验证next auth 在以下示例中next auth 有一个电话useSession 它返回两个对象 session and loading 然而 我见过的例子都没有实
  • 使用 HERE API 获取我的位置时出现问题(Wifi)[已更新]

    我在我的平板电脑上安装了 HERE 测试产品 这是一款旧的 Android 5 1 平板电脑 没有 GPS 或蜂窝数据 只有 Wifi 并且它可以很好地 大约 使用 Wifi 提供我的位置 所以我尝试在我的应用程序中进行相同的编程 下载了
  • Cordova 插件的输出延迟

    我编写了一个 Cordova 插件来下载文件并将其保存在数据文件夹中 除了返回值之外 一切都工作正常 我想显示一个进度条并需要获取当前进度 这是我的代码中的相关部分 while readed is read buffer gt 0 fos
  • Rails CSRF 令牌 - 它们会过期吗?

    我注意到 如果您使用无效的 CSRF 令牌发帖 rails devise 会自动将您注销 我有一个不刷新页面的应用程序 用户长时间坐在实时页面上 有时用户会被踢出 我想知道 CSRF 令牌是否已过期 从而使其无效 这就是为什么我想了解 Ra
  • 从 Gradle 构建中复制 Maven“dependencyManagement”标签

    我正在尝试跟随这个 Spring Boot Vaadin 指南 https www baeldung com spring boot vaadin however我正在使用 Gradle not Maven 在该指南的最顶部 他们说使用以下
  • 在 Fortran 中执行张量积的有效方法

    我需要在 Fortran 中对一些大型数组执行一些张量积和收缩 有时它们是向量或矩阵 有时涉及的一些对象是 3 数组或 4 数组 当然 通过一些嵌套循环编写一个子例程来实现此目的非常容易 而这正是我所做的 但对于非常大的数组 我必须多次调用
  • jQuery scrolltop - 第一次使用后不起作用

    我在此菜单上使用 jQuery 滚动顶部功能 http goethesternfriseure de index php http goethesternfriseure de index php 问题是滚动功能仅在第一次起作用 第二次点击
  • 如何检查 stopCluster (R) 是否工作

    当我尝试使用 stopCluster 从工作区中删除集群时 它似乎不起作用 下面是我正在使用的代码 gt cl lt makeCluster 3 gt cl socket cluster with 3 nodes on host local
  • 在 React 中在函数内声明函数

    我刚刚遇到了一个 React 代码 我不确定这是否是一个好方法 这是该代码的示例实现 class App extends React Component renderMessage gt function getMessage return
  • 程序退出后,使curses程序输出保留在终端回滚历史记录中

    我对诅咒很陌生 所以我正在尝试 python 中的一些不同的东西 我已经初始化了窗口并为窗口对象设置了scrollok 我可以添加字符串 并且滚动可以正常工作 这样 addstr 在窗口末尾不会出现任何错误 我想要的是在程序完成后能够在终端
  • IIS URL 重写 ASP

    我尽力扫描论坛寻求帮助 以制作 web config 来重写此类 url domain com default asp id 3 language 2 我希望这可以是 domain com en service where language
  • Angular2 中的动态模板“嵌入”

    我正在努力实现这样的目标 我有一个名为的模型类ObjectTypeA ObjectTypeB and ObjectTypeC 还有一个工厂ComponentFactory 根据传入的对象类型将创建不同的组件 ComponentFactory