【发布时间】:2017-07-13 01:02:26
【问题描述】:
这个问题是 this question 的 Angular 版本。
下面的sn-p总结了我的第一次尝试:
class NewParentComponent {
constructor(elRef: ElementRef) {
elRef.nativeElement.appendChild(myMovableElement);
// where the reference to myMovableElement may come from a service.
}
}
此尝试存在以下问题:
- 我们不应该直接在 Angular 中操作 DOM。是否可以通过
Renderer以某种方式移动组件? (答案:根据cgTag's answer,使用Renderer2)。 - 如果移动子组件后原始父组件被销毁,则在子组件上调用
ngOnDestroy方法。
请参阅 this Plunker 演示该问题。这个 Plunker 建立在 Angular Dynamic Component Loader example 之上。打开浏览器控制台日志,注意“destroyed!”每次广告横幅更改时都会记录文本,即使“拖我!”文本被拖入下拉框。
【问题讨论】:
-
您需要移动组件还是仅仅移动 DOM 节点?如果是组件,你如何创建它们?
-
我需要将一个子组件(不仅仅是一个节点)从一个父组件移动(拖放)到另一个父组件。一旦子组件被移动,原来的父组件可能会被销毁,不应该在子组件上调用
ngOnDestroy方法。 -
好的,您是否动态创建和注入它们?创建一个plunker。渲染器不会帮助您移动组件
-
我会尝试组装一个简洁的 Plunker,但是父组件是使用this approach 创建和销毁的。看这个例子,想象一个位于广告横幅内的组件,可以拖放到广告横幅之外。一旦将该组件移出广告横幅,您就不想在广告横幅被销毁时在该组件上调用
ngOnDestroy。我希望这会有所帮助! -
是的,这是正确的做法,好吧,创造最简单的plunker,我去看看
标签: angular