Kendo-条件元素的弹出锚点

Kendo-popup anchor to conditional element

我的模板中有以下内容,它们按预期工作并在锚元素旁边显示了弹出窗口:

<a title="Search" #searchAnchor (click)="toggleSearchPopup()">
  <icon [iconId]="'search'"></icon>
</a>

<kendo-popup #searchPopup
             [anchor]="searchAnchor"
             [anchorAlign]="anchorAlign"
             [popupAlign]="popupAlign"
             *ngIf="show">
  <!-- popup content... --> 
</kendo-popup>

我现在用 ngIf 使锚元素成为条件元素,但弹出窗口不再显示在锚旁边,它显示在位置 0, 0:

<a *ngIf="loggedIn" title="Search" #searchAnchor (click)="toggleSearchPopup()">
  <icon [iconId]="'search'"></icon>
</a>

IDE 还在行 [anchor]="searchAnchor" 上警告我 Unresolved variable or type searchAnchor,大概是因为具有该 ID 的元素可能不存在(尽管当弹出窗口出现时它总是存在)显示)。

kendo-popup docs 声明:

If an anchor is not provided, the Popup will use the offset property value.

这似乎是正在发生的事情。

我能想到的解决这个问题的唯一方法是在 <a> 周围添加一个 <div> 或类似的东西并改为锚定它:

<div #searchAnchor>
  <a *ngIf="loggedIn" title="Search" (click)="toggleSearchPopup()">
    <icon [iconId]="'search'"></icon>
  </a>
</div>

这会再次将弹出窗口锚定在正确元素旁边,但是是否有更好的方法可以让我仍然可以锚定到 <a> 但不知何故告诉它弹出窗口打开时它会在那里?

我通过将 both 弹出元素和锚元素移动到具有 *ng-if<ng-container 元素中来实现这一点,如此处所述文档: https://angular.io/guide/structural-directives#ng-container-to-the-rescue

文档专门讨论了使用 HTML 容器元素,例如 <div> (正如我所尝试的那样) 指出虽然这可行,但可能是意想不到的破坏外表的后果。

我现在的工作代码是:

<ng-container *ngIf="loggedIn">
  <a title="Search" #searchAnchor (click)="toggleSearchPopup()">
    <icon [iconId]="'search'"></icon>
  </a>

  <kendo-popup #searchPopup
             [anchor]="searchAnchor"
             [anchorAlign]="anchorAlign"
             [popupAlign]="popupAlign"
             *ngIf="show">
    <!-- popup content... --> 
  </kendo-popup>
</ng-container>

此处显示了一个简化的工作示例: https://stackblitz.com/edit/angular-ypkajr