另一个答案在解决问题方面做得很差。EventEmitters 仅用于与@Outputs
此问题结合使用,而不是利用 Angular 2 中内置的依赖注入或 RxJS 的特性。
具体来说,通过不使用 DI,您会强迫自己进入一个场景,如果您重用依赖于静态类的组件,它们都会收到相同的事件,而这可能是您不想要的。
请看下面的例子,利用 DI,很容易多次提供同一个类,使使用更加灵活,同时避免了对有趣的命名方案的需要。如果您想要多个事件,您可以使用不透明标记提供这个简单类的多个版本。
工作示例:
http ://plnkr.co/edit/RBfa1GKeUdHtmzjFRBLm?p=preview
// The service
import 'rxjs/Rx';
import {Subject,Subscription} from 'rxjs/Rx';
export class EmitterService {
private events = new Subject();
subscribe (next,error,complete): Subscriber {
return this.events.subscribe(next,error,complete);
}
next (event) {
this.events.next(event);
}
}
@Component({
selector: 'bar',
template: `
<button (click)="clickity()">click me</button>
`
})
export class Bar {
constructor(private emitter: EmitterService) {}
clickity() {
this.emitter.next('Broadcast this to the parent please!');
}
}
@Component({
selector: 'foo',
template: `
<div [ngStyle]="styl">
<ng-content></ng-content>
</div>
`,
providers: [EmitterService],
directives: [Bar]
})
export class Foo {
styl = {};
private subscription;
constructor(private emitter: EmitterService) {
this.subscription = this.emitter.subscribe(msg => {
this.styl = (this.styl.background == 'green') ? {'background': 'orange'} : {'background': 'green'};
});
}
// Makes sure we don't have a memory leak by destroying the
// Subscription when our component is destroyed
ngOnDestroy() {
this.subscription.unsubscribe();
}
}