Ng-template to bootstrap popover inside svg

Ng-template to bootstrap popover inside svg

我正在使用 Angular 5 和 Ngx-Bootstrap 开发一个网络应用程序,我在 SVG 标签内的模板中遇到了问题。

我正在 svg 组(g 标签)中循环。在 G 内部我有一些 foreignObjects,当鼠标在它上面时,我想为每个 foreignObject 使用 bootstrap popover,但是我需要在 popovers 内部进行绑定,并且模板需要来自循环的数据。

<g *ngFor='let textBox of textBoxes'>
    <foreignObject [id]='textBox.name' [attr.x]='textBox.topLeftNode.x' [attr.y]='textBox.topLeftNode.y'
        [attr.width]='getWidth(textBox)' [attr.height]='getHeight(textBox)' [popover]='commentsTemplate' 
        popoverTitle='Comments' triggers='mouseenter' [outsideClick]='true' container='body' placement='right'>
    </foreignObject>

    <ng-template #commentsTemplate>
        <span class='comment' *ngFor='let comment of getComments(textBox.id)'>
          {{comment}}
        </span>

        <input type='text' class='form-control comment-input' placeholder='Add comment...'>
        <button class='btn btn-secondary comment-submit'>Comment</button>
    </ng-template>
</g>

当angular-cli构建应用程序(不显示错误)时,浏览器仅显示空白页面,控制台显示以下错误:

Error: Template parse errors: Unexpected closing tag ":svg:ng-template". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags ("dd comment...'> Comment [ERROR ->] "): ng:///AppModule/ReadComponent.html@78:10

但是我已经设置了 popover 容器 "body"。

我已经尝试使用 ng-container 并将 ng-template 标签放入另一个 foreignObject 中,但控制台显示 :svg:ng-template 不存在...

我不能将 ng-template 放在主要的 foreignObject 中,因为我绑定了它的内容(我没有显示绑定以避免误解)。

抱歉,英语令人困惑。

有人可以帮助我吗?

已解决。我确实在循环的 ng-template 中放了一个 ng-container 。所以我的 ng-container 调用外部 ng-template,传递上下文。

<svg>
    <g *ngFor='let textBox of textBoxes'>
        <foreignObject [id]='textBox.name' [attr.x]='textBox.topLeftNode.x' [attr.y]='textBox.topLeftNode.y'
            [attr.width]='getWidth(textBox)' [attr.height]='getHeight(textBox)' [popover]='preCommentsTemplate' 
            popoverTitle='Comments' triggers='mouseenter' [outsideClick]='true' container='body' placement='right'>
        </foreignObject>

        <ng-template #preCommentsTemplate>
            <ng-container *ngTemplateOutlet='commentsTemplate; context: textRectangle'></ng-container>
        </ng-template>
    </g>
</svg>

<ng-template #commentsTemplate let-id='id'>
    <span class='comment' *ngFor='let comment of getComments(id)'>
      {{comment}}
    </span>

    <input type='text' class='form-control comment-input' placeholder='Add comment...'>
    <button class='btn btn-secondary comment-submit'>Comment</button>
</ng-template>

我只是想警告你,因为 angular 9 <ng-template><svg> 元素内使用时经常会出现问题。参见 also

我最终用 <g> 元素替换了所有 <ng-template>,这些元素还可以包含结构指令,例如 *ngIf*ngFor