Angular 2:从ng-content

时间:2016-02-23 09:56:28

标签: angular

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上,我不想创建额外的模板或组件。可能我错过了一些明显的东西。

Planker

1 个答案:

答案 0 :(得分:7)

show()会解析为<app>的父组件,因为看起来<app>是根组件,所以没有父组件。

我想这里的错误是Angular甚至试图绑定到click事件。 我的印象是根组件上根本不支持<ng-content>

另请参阅https://github.com/angular/angular/issues/1858https://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>只是一个投影 - 元素显示在不同的地方就是全部,它们仍然由最初添加它们的组件“拥有”。