使用 Renderer2 向元素添加指令

Adding directive to an element using Renderer2

我有一个指令,当您将鼠标悬停在元素上时,它会实现一个滑块,如果您在将鼠标悬停在图像上时访问此 site,该指令会使其他图像绝对为主图像,并启用滑动到下一个的箭头图像,唯一的问题是我有一个 appLazyLoadWithLoading 指令,当图像在页面中可见且不在屏幕外时加载图像,并在加载前添加加载,我正在寻找一种方法将我的指令添加到创建的 img 元素。

let img = this.renderer2.createElement('img');
this.renderer2.setAttribute(img, "src", this.thumbnailMaker(element.url));
this.renderer2.setAttribute(img, "alt", element.name);
this.renderer2.setAttribute(img, "title", element.name);
this.renderer2.appendChild(this.el.nativeElement.parentElement, img);

通过这种方式添加了 img 元素,但我无法向其添加指令 尝试过这种方式和 $compile 但他们没有工作。

this.renderer.setAttribute(img, "appLazyLoadWithLoading", "work please!");

可以不使用 Renderer2,而是使用 dynamic component loading

基本上,不是创建 img html 元素,而是创建一个组件,其中包含一个 img 元素,使用您想要的任何指令,然后动态加载该组件.

这是一个例子StackBlitz

在 Angular v12 之前,您无法在 DOM 中动态添加组件。

一个解决方案可以,

  1. 使用选择器创建组件 [appLazyLoadWithLoading]
  2. 将此组件转换为 Angular 个元素。
  3. 现在您可以动态使用转换后的组件了。

基本上发生的事情是 Angular 元素帮助将您的组件转换为 Web 组件。因此,当您将特定选择器添加到 DOM 时,特定的 Web 组件将启动,您将在 HTML.

上看到所需的行为