angular: 从外部访问 ng-content 嵌套组件方法
angular: access ng-content nested component method from outside
我有两个共享组件,我希望 parent 在其 child
中调用一个方法
共享组件 1 (parent)
@Component({
selector: 'parent',
template: `<div>
<div #parentBody>
<ng-content select="[parentBody]"></ng-content>
</div>
<button (click)=" " >tell child to dance</button>
</div>
`,
})
export class ParentComponent {
constructor() { }
}
共享组件 2 (child)
@Component({
selector: 'child',
template: `<div>
<p>I'm a child component</p>
</div>
`,
})
export class ChildComponent {
dance() {
alert('dancing');
}
}
在应用程序组件中
<parent>
<div parentBody>
<child></child>
</div>
<parent>
在这种情况下,我们如何在 parent 和 child 组件之间进行通信
您可以通过两种方式完成:
1)父组件中的@Output参数
parent.component.ts:
import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'parent',
template: `
<div>
<div #parentBody>
<ng-content select="[parentBody]"></ng-content>
</div>
<button (click)="dance.emit()">tell child to dance</button>
</div>
`
})
export class ParentComponent {
@Output() dance = new EventEmitter();
}
app.component.html:
<parent (dance)="myChild.dance()">
<div parentBody>
<child #myChild></child>
</div>
<parent>
Check this simple StackBlitz DEMO which is using @Output approach
2) @ContentChild父组件中的参数。
(在@trichetriche 评论此问题后添加。感谢@trichetriche!)
parent.component.ts:
import { Component, Input, ContentChild } from '@angular/core';
import { IChild } from './i-child';
@Component({
selector: 'parent',
template: `
<div>
<div #parentBody>
<ng-content select="[parentBody]"></ng-content>
</div>
<button (click)="onClick()">tell child to dance</button>
</div>
`
})
export class ParentComponent {
@ContentChild('myChild') child: IChild;
onClick() {
this.child.dance();
}
}
app.component.html:
<parent>
<div parentBody>
<child #myChild></child>
</div>
<parent>
Check this simple StackBlitz DEMO which is using @ContentChild approach
这两种方式都能很好地满足您的要求。
我有两个共享组件,我希望 parent 在其 child
中调用一个方法共享组件 1 (parent)
@Component({
selector: 'parent',
template: `<div>
<div #parentBody>
<ng-content select="[parentBody]"></ng-content>
</div>
<button (click)=" " >tell child to dance</button>
</div>
`,
})
export class ParentComponent {
constructor() { }
}
共享组件 2 (child)
@Component({
selector: 'child',
template: `<div>
<p>I'm a child component</p>
</div>
`,
})
export class ChildComponent {
dance() {
alert('dancing');
}
}
在应用程序组件中
<parent>
<div parentBody>
<child></child>
</div>
<parent>
在这种情况下,我们如何在 parent 和 child 组件之间进行通信
您可以通过两种方式完成:
1)父组件中的@Output参数
parent.component.ts:
import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'parent',
template: `
<div>
<div #parentBody>
<ng-content select="[parentBody]"></ng-content>
</div>
<button (click)="dance.emit()">tell child to dance</button>
</div>
`
})
export class ParentComponent {
@Output() dance = new EventEmitter();
}
app.component.html:
<parent (dance)="myChild.dance()">
<div parentBody>
<child #myChild></child>
</div>
<parent>
Check this simple StackBlitz DEMO which is using @Output approach
2) @ContentChild父组件中的参数。
(在@trichetriche 评论此问题后添加。感谢@trichetriche!)
parent.component.ts:
import { Component, Input, ContentChild } from '@angular/core';
import { IChild } from './i-child';
@Component({
selector: 'parent',
template: `
<div>
<div #parentBody>
<ng-content select="[parentBody]"></ng-content>
</div>
<button (click)="onClick()">tell child to dance</button>
</div>
`
})
export class ParentComponent {
@ContentChild('myChild') child: IChild;
onClick() {
this.child.dance();
}
}
app.component.html:
<parent>
<div parentBody>
<child #myChild></child>
</div>
<parent>
Check this simple StackBlitz DEMO which is using @ContentChild approach
这两种方式都能很好地满足您的要求。