从DOM元素获取ComponentRef

已经回答了如何从Angular 2组件获取DOM元素: ComponentRef.location.nativeElement (ComponentRef.location给出了可直接访问DOM的ElementRef)。

但是如何做相反的事情,即当我只有本地DOM对象时,获取对ComponentRef的引用?

当我尝试使用interact.js拖动/放置Angular 2组件时,就遇到了这种情况。 该库使用回调函数来通知哪个元素被拖动,以及我们试图拖放哪个元素。 提供了一个event对象,我发现的唯一有用的信息是DOM元素( target属性)。

例:

interact('my-component-tag').draggable({
    // ...
    onstart: function (event:any) {
        var dom = event.target; // ref to the <my-component-tag> tag
        // How to find the Angular ComponentRef object here?
    }
    // ...
}).dropzone({
    // ...
    ondragenter: function (event:any) {
        var targetDom = event.relatedTarget; // targeted <my-component-tag> tag
        // Same question here,
        // to identify where we want to insert the dragged element.
    }
    // ...
});

Plunker在这里

您可以检查src/Interactjs.ts的处理程序。 打开控制台查看关联的日志并将组件拖放到另一个组件上。 我有关于DOM的元素的信息,但我想要Angular组件,让我们来说说访问count属性。

调查结果和尝试:

我找到了jquery-ui-draggable插件的一个解决方案,但是这个技巧在这里不起作用,至少对于放弃的目标。

还有关于如何在DOM中插入的主题,讨论DomAdapter,但是我还没有找到任何似乎有助于从DOM到Angular组件参考的方法。

我只是想过对我的组件进行手动搜索:在DOM节点中循环,计数以找到位置,并从组件列表中的相同位置到达组件,但它非常难看...

任何意见都是值得欢迎的。 谢谢阅读!


这可以使用ElementProbe API来实现。 它主要用于调试/量角器集成,类似于Angular 1中的element.scope()

为了使用这个API,你需要在你的bootstrap()调用中包含ELEMENT_PROBE_PROVIDERS 。 您将可以通过调用全局ng.probe()来获取任何组件实例。

例如,以下是如何获取当前事件目标的组件实例:

ng.probe(event.target).componentInstance

更新的Plunker显示这是行动

您可以在这里看到ElementProbe API的实际实现。

链接地址: http://www.djcxy.com/p/30485.html

上一篇: Get ComponentRef from DOM element

下一篇: Gulp sourcemaps with TypeScript and Babel