Angular 2 ng-content 从 child 组件接收事件

Angular 2 ng-content receive event from child component

我正在构建一个包含多个动态面板的页面,每个 child 面板都具有相同的 HTML 因此我创建了一个 parent 面板组件来包装每个面板。

问题是我想从 child 向面板发送一个事件,但我似乎找不到答案。这是我目前所拥有的:

// Panel Panel Component
@Component({
    selector: 'panel',
    template: `
    <div (emittedEvent)="func($event)">
        <ng-content></ng-content>
    </div>
    `
})
export class PanelComponent {

    constructor() {}

    func(event) {
    // Do stuff with the event
    }
}
// Child Panel Component (one of many)
@Component({
selector: 'child-panel-one',
template: `
    // Template stuff
    <button (click)="emitEvent()">Click</button>
`
})
export class ChildPanelOne {
emittedValue: Boolean = false;

@Output() emittedEvent = new EventEmitter();

constructor() {}

private emitEvent() {
    this.emittedValue = true;

    this.emittedEvent.emit(this.emittedValue)
}
}
//
// Main Parent Template
<panel>
    <child-panel-one></child-panel-one>
</panel>

我可以创建一个共享服务,但将布尔值从 child 传递到 parent 似乎有些矫枉过正。

有什么想法吗?

谢谢

有几种方法

<panel #p>
    <child-panel-one (emittedEvent)="p.func($event)"></child-panel-one>
</panel>

但这需要 <panel> 的用户设置事件绑定

或者您可以像

中所示的 DOM 事件

或者您可以使用 ´@ContentChildren()` 然后强制订阅

@ContentChildren(ChildPanelOne) childPanels:QueryList<ChildPanelOne>
ngAfterContentInit() {
  this.childPanels.toArray().forEach(cp => cp.emittedValue.subscribe(() => ...));
}

但这要求所有子面板都是预定义类型。

您还可以将共享服务与子组件注入并用于向父组件发出事件的可观察对象一起使用。

从子内容中捕获事件的另一种方法是获取父组件的引用并定义

constructor(app:AppComponent){ //<-- get the ref of the parent component
    app['clic'] = this.clic; //<-- declare function and bind our function 
    this.name = 'myself';
}

clic(){
    alert('clicked');
}

ngOnDestroy() {
    delete this.app['clic']; // <-- get rid of the function from parent component, when we are done
}

WORKING DEMO ( )