代码之家  ›  专栏  ›  技术社区  ›  Petros Kyriakou

ngTemplateOutlet阻止指令正常工作

  •  1
  • Petros Kyriakou  · 技术社区  · 8 年前

    我正在构建一个tabs组件,并在其标题中添加了一个ripple组件,该组件附加了一个类并进行动画处理,如下面的代码所示。

    然而,即使它在我的所有其他组件(即按钮)中都能工作,但在ngTemplateOutlet上下文中使用时似乎也无法工作。也许我做错了什么。欢迎提供任何提示。

    选项卡组件模板

    <div class="nui-tab-group">
      <ng-template #defaultTabsHeader let-tabs="tabs">
        <ul class="nui-tab-group-buttons" *ngIf="tabs">
          <li class="tab-button"
              [ngClass]="{selected: tab.selected}"
              (click)="selectedTab(tab)"
              ripple-c
              *ngFor="let tab of tabs">{{ tab.title }}
          </li>
        </ul>
      </ng-template>
    
      <ng-container *ngTemplateOutlet="headerTemplate || defaultTabsHeader; context: tabsContext"></ng-container>
    
      <ng-content></ng-content>
    </div>
    

    波纹元件主要部件

    @HostListener('click', ['$event', '$event.currentTarget'])
      click(event, element) {
        if (this.rippleStyle === 'expand') {
          let ripple = document.createElement('span'),
            rect = element.getBoundingClientRect(),
            radius = Math.max(rect.height, rect.width),
            left = event.pageX - rect.left - radius / 2 - document.body.scrollLeft,
            top = event.pageY - rect.top - radius / 2 - document.body.scrollTop;
    
          ripple.className = 'expand-ripple-effect animate';
          ripple.style.width = ripple.style.height = radius + 'px';
          ripple.style.left = left + 'px';
          ripple.style.top = top + 'px';
          ripple.addEventListener('animationend', () => {
            element.removeChild(ripple);
          });
          element.appendChild(ripple);
        }
      }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   yurzui    8 年前

    这样做的主要原因是,每次发生更改检测时,您的列表都会重新显示,因为您正在将新对象传递给 context

    get tabsContext() {
      return {
        tabs: this.tabs
      }
    }
    

    NgTemplateOutlet指令看到此更改并清除模板

    将准备好的数据用于模板

    tabsContext: any;
    
    ngAfterContentInit (): void {  
      ...  
      this.tabsContext = {
        tabs: this.tabs
      }
    }
    

    Stackblitz Example

    另见类似情况

    推荐文章