【发布时间】:2020-10-18 20:37:08
【问题描述】:
我有一个带有 SVG 元素的组件,我试图将该 SVG 的各个部分分成不同的组件。 嵌套组件需要从父组件动态创建,这是因为我从一个 json 文件构建整个 SVG 图形,该文件确定需要添加哪些嵌套组件(SVG 嵌套形状)。
为了动态创建组件,我使用了 ComponentFactoryResolver 和 ViewContainerRef 来自@angular/core
@Component({
selector: 'skick-player',
templateUrl: './player.component.html',
styleUrls: ['./player.component.scss'],
})
export class PlayerComponent implements OnInit, AfterViewInit {
@ViewChild('svgContainer', { read: ViewContainerRef }) container;
constructor( private resolver: ComponentFactoryResolver) {}
performFrame() {
....
//Add nested component
const factory = this.resolver.resolveComponentFactory(
BackDropItemComponent
);
const componentRef = this.container.createComponent(factory);
componentRef.instance.imagePath = objectUrl;
}
}
});
}
问题在于 Angular 将嵌套组件包裹在一个 div 中:
<div _nghost-qon-c42="" skick-back-drop-item="" class="ng-star-inserted">
由于创建了特殊的元素标签,因此它不会被渲染。如果该 div 元素被移除,它会正确呈现嵌套的 SVG。
我知道我可以将嵌套组件渲染为指令,它会起作用,如下所示:
<svg>
<svg:g skick-back-drop-item />
</svg>
但在我的用例中,控制器需要从父组件动态呈现,因此这种方法对我不起作用。
也许有办法以编程方式从父组件呈现(添加嵌套控制器)作为指令(请记住嵌套组件具有@input 属性)?
或
是否可以有不可见的组件容器?在没有任何容器的情况下渲染嵌套组件的内容?
父模板:
<div class="patch-overlay" cdkDrag>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:svgjs="http://svgjs.dev/svgjs" width="100%" height="100%">
<<ng-container #svgContainer></ng-container>>
</svg>
</div>
嵌套组件模板(示例):
<svg width="400" height="110">
<rect [attr.width]="width" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
</svg>
【问题讨论】:
-
stackblitz.com/edit/… 这次请检查这个例子 Angular 没有将程序创建的组件包装在 div 中
-
@hanan,谢谢,它将它包装在
容器中,这就是为什么在您的示例中没有呈现矩形的原因。我发现添加了以下 CSS 规则: hello { display: contents;做这个把戏,但我不太喜欢这种方法 -
@D.B,如果你的组件的选择器被
[和]包围:selector: '[skick-back-drop-item]',你可以应用到任何html标签
标签: angular svg angular-directive angular-components