2017-10-05 69 views
1

我正在构建一个选项卡组件,并在其标题中添加了一个连接类并执行动画的纹波组件,如下面的代码所示。ngTemplateOutlet禁止指令正常工作

但是,即使它在我所有其他组件中都能正常工作,即按钮似乎在ngTemplateOutlet上下文中使用时失效。也许我做错了什么。任何提示欢迎。

tabsComponentTemplate

<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); 
    } 
    } 
+0

你可以创建plunker吗? – yurzui

+0

@yurzui我想创建一个,但很多事情因为某些原因不能像CSS一样工作。你有没有可以使用的任何角度4的样品?那些我发现吸 –

+0

https://stackblitz.com/edit/angular-uaxqwg?file=app%2Fripple.directive.ts – yurzui

回答

1

造成这种情况的主要原因是,你的名单重新呈现每一次变化检测是因为你传递新的对象,每次context

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

NgTemplateOutlet指令看到这个变化,并清除templateю

准备使用数据模板

tabsContext: any; 

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

Stackblitz Example

也见类似的案件

+0

这个很好记,谢谢! –

+0

不客气! – yurzui