我想在Angular2中构建一个drum machine,类似于an existing Angular项目。
我构建组件的方法是让SequencerComponent(父级)以指定的间隔(BPM)发出事件(@Output)。
// sequencer.component.ts
@Output() metronome = new EventEmitter();
onBeat(count: number) {
if(this.isPlaying) {
this.beat.one = count == 1;
this.beat.two = count == 2;
this.beat.three = count == 3;
this.beat.four = count == 4;
this.metronome.emit(this.beat);
}
}
PadsComponent(child)侦听此事件(@Input),如果PadComponent(grand-child)设置为active,则应播放声音。
// pads.component.ts
export class PadsComponent {
@Input() hit: any = {};
}
// pads.component.html
<pad [class.active]="hit.one" class="column pad"></pad>
<pad [class.active]="hit.two" class="column pad"></pad>
<pad [class.active]="hit.three" class="column pad"></pad>
<pad [class.active]="hit.four" class="column pad"></pad>
我可以让类更改,但显然我想做的不仅仅是HTML属性绑定。 Working example
如何让孩子和孩子在模型更换中运行功能?是否有更好,更惯用的方法来解决这个问题?
我尝试过使用ngDoCheck
,但我还没有发现如何在这个用例中使用它。
更新:hit
被绑定到beat
中的sequencer.component.html
,如下所示:
<!-- sequencer.component.html -->
<div class="columns">
<div class="column">
<a class="button is-success" (click)="onPlay($event)" href="">Play</a>
<a class="button is-danger" (click)="onStop($event)" href="">Stop</a>
</div>
</div>
<pads [hit]="beat"></pads>
答案 0 :(得分:2)
而不是@Input() hit: any = {};
你可以拥有hit
的getter和setter:
private _hit; // define a private variable _hit
@Input()
set hit(hit:any){
this._hit = hit; // set the private variable and do whatever you want after each change
playSomeSound(hit);
}
get hit(){
return this._hit;
}
您的模板代码仍然相同,
<pad [class.active]="hit.one" class="column pad"></pad>
...
check this plunk举个例子。
答案 1 :(得分:1)
以下是如何使用ngDoCheck()
观察模型更改并将其发出的示例:
ngDoCheck() {
if (this.previousModel !== this.model) {
this.modelChange.emit(this.model);
}
this.previousModel = this.model;
}