Angular app结构:
<app><div content><a href="#" (click)="show()">click me</a></div></app>
内容组件模板:
<ng-content></ng-content>
内容组件具有公共方法show()
,但是当我点击此链接时,我得到:
Error: EXCEPTION: Error during evaluation of "click"
ORIGINAL EXCEPTION: TypeError: l_context.show is not a function
ORIGINAL STACKTRACE:
anonymous/ChangeDetector_AppComponent_0.prototype.handleEventInternal@http://localhost:3000/node_modules/angular2/bundles/angular2.dev.js line 10897 > Function:207:13
AbstractChangeDetector</AbstractChangeDetector.prototype.handleEvent@http://localhost:3000/node_modules/angular2/bundles/angular2.dev.js:8788:17
基本上我想重用页面标记并将监听器放在现有的dom上,我不想创建额外的模板或组件。可能我错过了一些明显的东西。
答案 0 :(得分:7)
show()
会解析为<app>
的父组件,因为看起来<app>
是根组件,所以没有父组件。
我想这里的错误是Angular甚至试图绑定到click事件。
我的印象是根组件上根本不支持<ng-content>
。
另请参阅https://github.com/angular/angular/issues/1858(https://github.com/angular/angular/issues/6046)
<强>更新强>
<h1>Angular</h1>
<div content #contentRef>
<ui>
<li><a href="#" (click)="contentRef.show($event)" class="link" button>link 1</a></li>
<li><a href="#" (click)="contentRef.show($event)" class="link" button>link 2</a></li>
<li><a href="#" (click)="contentRef.show($event)" class="link" button>link 3</a></li>
</ui>
</div>
绑定在声明它们的组件中解析。在上面的示例中,我通过在目标元素上创建模板变量ContentComponent
并在定义点击处理程序#contentRef
时引用它来显式地重定向对(click)="contentRef.show($event)"
的引用。
即使使用<ng-content>
将内容“传递”到另一个组件,也不意味着范围会发生变化。 <ng-content>
只是一个投影 - 元素显示在不同的地方就是全部,它们仍然由最初添加它们的组件“拥有”。