Nativescript Slider(https://docs.nativescript.org/angular/code-samples/ui/slider.html)を使用して速度(間隔)を設定してメトロノームを作成しました。Nativescript Slider Value Delayed
このコードは正常に動作します(リアルタイムで正確に速度変化):
app.component.html
<Slider #sl minValue="10" maxValue="350" [(ngModel)]="interval" (valueChange)="setInterval(interval)" row="0" col="1"></Slider>
app.component.ts
public metronome = sound.create("~/pages/metronome/click.mp3");
public interval: number = 120;
public timer: number;
start(){
this.stop(); // Stop previous metronome
this.tick();
}
stop() {
clearTimeout(this.timer);
}
setInterval(interval: number) {
this.interval = interval;
}
public tick() {
console.log("Tick");
this.metronome.play();
this.timer = setTimeout(this.tick.bind(this), this.interval);
}
しかし、上記のコードでは、メトロノームはbpm(ビート/分)の代わりにms(ミリ秒)を使用します。ミュージシャンはBPMでメトロノームを設定したい。したがって
:ms = 60'000/BPM
(=> this.plainIntervalを参照)
setInterval(){
this.plainInterval = 60000/this.interval;
}
public tick() {
console.log("Tick");
this.metronome.play();
this.timer = setTimeout(this.tick.bind(this), this.plainInterval);
}
今私の問題:私は、スライダーを使用したよう 、値が正しく更新されません。
i.E .:スライダのデフォルトは120です。私は60にスライドします。値はまだ120にとどまっています...そして、私は200にスライドし、今度は値が120にジャンプします。私は10にスライドし、200になります。
次のとおりです。古い値を取得することを示します。新しい価値を設定すると、古いものが引き起こされます。
plainInterval
とinterval
を同期させて問題を解決するにはどうすればよいですか?
:これは、作業コードですあなたは投稿していません –
申し訳ありません、コードを更新しました。 Nativescript Slider(https://docs.nativescript.org/angular/code-samples/ui/slider.html) – Taremeh
Angular-2アプリケーションでは、双方向バインディングにngModelのみを使用する必要があります。 ngModelの後にトリガされるvalueChangedと同じ仕事をしてください(私はあなたの値があなたが期待するものからあなたの値を "ステップ"に戻しています)。 –