【发布时间】:2016-12-02 11:56:58
【问题描述】:
我想知道是否可以在 Angular 2 中执行以下操作。使用此模板的组件(例如):
父组件模板
<div>
<childOne></childOne>
<childTwo *ngFor="let item of items">
whatever
</childTwo>
</div>
有没有办法使用 ParentComponent 中的 ViewContainerRef 删除这些项目,如下所示?
var viewContainerRef = /* get ParentComponent ViewContainerRef */
var index = viewContainerRef.indexOf(childViewRef);
viewContainerRef.remove(index);
我尝试使用类似于此处提出的解决方案来检索子 ViewRef: Angular2 , How to find index of a view inside a viewContianer
但是 indexOf 返回 -1,好像容器中不存在子 ViewRef。
我想在 ParentComponent 之外删除这些子组件,而不是在 ParentComponent 代码中,例如从 items 数组中删除或通过绑定。
我也尝试使用渲染器中的 destroyView 方法,但没有效果。 NgFor 正在遍历 items 数组并为每个 childTwo 创建嵌入式视图,如果在这种情况下,从 ChildTwo 注入器(如链接解决方案中提出的)获得的 ViewRef 与这些 EmbeddedViewRef 相同,我不这样做。
有什么办法可以做这样的事情吗?
谢谢。
**************************** 更新 *********************** ****
我会尽量简化我想要实现的目标。我正在开发一个仪表板,用户可以在其中使用如下 API 创建其组件:
@Component({ selector: 'child' })
class UserChildComponent extends DashboardComponent {
(...)
}
@Component({ selector: 'parent' })
class UserParentComponent extends DashboardComponent {
@ViewChildren(UserChildComponent) m_children: QueryList<UserChildComponent>;
private models: Array<ChildModel>;
(...)
}
/* UserParentComponent template
<div>
<child></child>
<child *ngFor="let model of models"></child>
</div>
我有一个所有仪表板组件及其相互关系(父/子)的逻辑树,因为这里不涉及子类型和其他内容。
这是我正在考虑的场景:用户将能够删除任何这些子仪表板组件。我想拥有所有需要的关系树,从父级中删除子级并通知用户(可能通过父级中的 ViewChildren)。或者我实际上可以在父级上调用一个方法,以便用户可以更新其模型数组,这可能是最好的方法。
我只是在想一种方法,让用户可以减少工作量,而不必担心同步模型\组件(在这种情况下)
再次感谢。
【问题讨论】:
-
您实际上想要完成什么?您要删除什么元素或组件,为什么?
-
没错,因为删除元素通常是 Angular 通过指令完成的工作
-
我希望能够从外部移除组件的任何子组件。 @GünterZöchbauer,我想要一种通用的方法来从外部的任何父组件中删除任何子组件。这将是实现我想要的最佳方式。
-
stackoverflow.com/questions/36325212/… 中演示的方法怎么样,用户只需要更新模型而不必担心同步 DOM。这就是Angular2中通常的做法。
-
@Daniel,Angular 旨在通过数据操作 DOM。这是错误的方法,因为您试图在不更改数据的情况下直接操作 DOM。即使你实现了这个包装器,它也不会改变这种情况——你只是将 DOM 操作委托给另一个仍然违背 Angular 意识形态的组件。所以我推荐的是:a)从数组中删除项目,剩下的由 Angular 完成; b) 需要删除的另一个组件包含在带有标志的 *ngIf 中 - 您的方法还需要显式放置自定义指令,因此请先使用标准指令。
标签: angular web-component