【问题标题】:Dynamic Components: Insert components of type X on the fly动态组件:动态插入类型 X 的组件
【发布时间】:2017-05-29 08:10:52
【问题描述】:

我想要实现两件事。两者都需要巧妙地使用组件。

首先,关于组件绑定的一般问题:在我看到的每篇文章中,模板中都使用了一个指令标签,以便以后绑定一个组件。但是,由于我的两个问题,我不能事先将指令放入模板中 - 相反,我需要动态地这样做。

  1. 我有一个“事物”列表。然而,“事物”只是父母,它有很多孩子——这意味着有多种类型的事物,每一种都有不同的价值。这让我为每件事都创建了一个组件:每个都有自己的模板。 但是,我也想显示这些东西的列表。不过,我事先并不知道它们:我是从服务器上获取它们的。在获得数据之前,我不知道它们的类型或数量。我现在想通过每次添加正确类型的组件来列出每个“事物”。如何正确添加绑定以动态加载组件?

  2. 我的用户可以通过使用不同的模式来“设计”他们的个人资料。生成的布局是从服务器获取的。这意味着,我不知道模态的数量或模态的类型。我现在如何才能正确地包含它们?

TL;DR 如何动态绑定组件,而无需为其各自类型设置适量的绑定?

【问题讨论】:

  • 你就是不这样做,因为没有办法。 stackoverflow.com/questions/36325212/… 包含一段代码,演示如何以命令方式读取和写入值。我不知道您对 2 的意思是什么。您需要将组件静态添加到您的应用程序中。组件 Angular 不知道您何时构建您的应用程序无法添加。
  • @GünterZöchbauer 感谢您的回复。但是,如何解决我目前遇到的问题呢?关于 2:我将在一分钟内进行编辑以使其更清晰。另外:并不是 Angular 不知道我要添加的组件——我确实事先定义了它们。我只是事先不知道要使用 哪些 组件。所以,基本上:我定义了组件 X、Y、Z。服务器现在告诉我“按照我给你的值的顺序将 X、Z、X、X、Y、Z、Y 放入列表中”。
  • 这就是我在第一条评论中链接到的答案。

标签: angular typescript dynamic binding load


【解决方案1】:

当组件信息来自服务器时,您可以执行以下操作:

您仍然必须将所有组件放在父模板中,但您只显示服务器返回的内容:

<div *ngFor="let dynamic of fromServer" [ngSwitch]="dynamic .id">
      <thing-a *ngSwitchCase="'thinga'" [data]="dynamic"></thing-a>
      <thing-b *ngSwitchCase="'thingb'" [data]="dynamic"></thing-b>
      <thing-c *ngSwitchCase="'thingc'" [data]="dynamic"></thing-c>
      <thing-d *ngSwitchCase="'thingd'" [data]="dynamic"></thing-d>
      <thing-e *ngSwitchCase="'thinge'" [data]="dynamic"></thing-e>
      <thing-f *ngSwitchCase="'thingf'" [data]="dynamic"></thing-f>
</div>

所以如果服务器返回:

[
   { id : "thinga" }
   { id : "thingd" }
   { id : "thingf" }

]

那么只会显示这3个。

您还可以根据服务器返回数据的顺序对组件进行动态排序

编辑:

如果服务器返回thinga 3次,则显示3次。

编辑 2: 示例:

[
   { id : "thinga", title: "Yes"}
   { id : "thinga", title: "No" }
   { id : "thinga", title: "Maybe" }
]

每个thinga 组件都会获得自己的数据

【讨论】:

  • 非常感谢您的回答。如果一个thinga显示3次,它是否也会显示不同的数据?如果是这样,这可能会以一种超级简单的方式解决我所有的问题!
  • 太棒了,非常感谢。正是我想要的,它也非常简单。我很快就会试试看。
猜你喜欢
  • 2015-03-21
  • 2017-03-27
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2019-12-08
相关资源
最近更新 更多