我正在构建一个包含多个动态面板的页面,每个子面板都具有相同的HTML,因此我创建了一个父面板组件来包装每个面板。
问题是我想从孩子向小组发送一个事件,但我似乎无法找到答案。这就是我到目前为止所拥有的:
// 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>
我可以创建一个共享服务,但是将布尔值从子节点传递给父节点似乎太过分了。
有什么想法吗?
由于
答案 0 :(得分:8)
有几种方法
<panel #p>
<child-panel-one (emittedEvent)="p.func($event)"></child-panel-one>
</panel>
但这需要<panel>
的用户设置事件绑定
或者您可以使用in Angular2 how to know when ANY form input field lost focus
中显示的DOM事件或者你可以使用'@ ContentChildren()`然后命令性地订阅
@ContentChildren(ChildPanelOne) childPanels:QueryList<ChildPanelOne>
ngAfterContentInit() {
this.childPanels.toArray().forEach(cp => cp.emittedValue.subscribe(() => ...));
}
但这需要所有子面板都是预定义类型。
您还可以使用带有objectable的共享服务,子组件注入并用于向父组件发出事件。
答案 1 :(得分:0)
从内容子级捕获事件的另一种方法是获取父级comp的引用并定义
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
}