3

webOSアプリではMojo.Widget.Slider、整数を0、1、または2に設定するために使用するものがあります。スライダーの値はすでに自分で丸めています(これを行う機能はありますが、使用をやめました)それが私の問題の原因でしたが、そうではありませんでした)が、ユーザーがスライドを完了した後、スライダーを丸められた整数の位置にスナップさせたいと思います。私が知る限り、これを行うために組み込まれているものは何もないので、自分で行う必要があります。次のようなことがうまくいくと思いました。

私のシーンアシスタントのセットアップ機能では:

this.mySliderModel = {value: 1};
this.controller.setupWidget('mySlider', {minValue: 0, maxValue: 2}, this.mySliderModel

そして、スライダーの変更をリッスンするには:

this.mySliderChangedEventListener = this.mySliderChanged.bindAsEventListener(this);
Mojo.Event.listen(this.controller.get("mySlider"), Mojo.Event.propertyChange, this.mySliderChangedEventListener);

そしてリスナー:

MainAssistant.prototype.mySliderChanged = function(event) {
    var sliderValue = Math.round(event.value);
    switch (sliderValue) {
        case 0:
        case 1:
        case 2:
            //it's a good value
            //do some stuff

            this.mySliderModel.value = sliderValue;
            this.controller.modelChanged(this.mySliderModel);
            break;
        default:
            Mojo.Log.info("mySlider error value: ", event.value);
            break;
    }
};

しかし、モデルを変更して呼び出すことmodelChangedは何もしないようですが、ドキュメントとサンプルコードはこれが機能することを示しています。コードが機能しない理由と、目的の効果を達成するために何ができるかについてのアイデアはありますか?

注:さまざまなウィジェットを使用してこの種のことを実現できることは承知していますが、スライダーを使用して実現したいと思います。これを機能させる方法が見つからない場合は、他のものを使用することが私のバックアップです。

4

1 に答える 1

3

この問題は、ウィジェットの handleModelUpdate のチェックにあるようです。ドラッグの進行中にウィジェットがモデルの変更を処理できないようにするフラグ (this.seeking) があります。ウィジェットで「ドロップ」が発生すると、そのフラグはクリアされますが、フラグがクリアされる 2 行前に propertyChange イベントがトリガーされます。

解決策は、モデルを再度更新する前に現在のスクリプトの実行を終了できるように、非常に短いタイムアウトを追加するのと同じくらい簡単です。

MainAssistant.prototype.mySliderChanged = function(event) {
    var sliderValue = Math.round(event.value);
    switch (sliderValue) {
        case 0:
        case 1:
        case 2:
            //it's a good value
            //do some stuff
            setTimeout(function() {
                this.mySliderModel.value = sliderValue;
                this.controller.modelChanged(this.mySliderModel);
            }.bind(this), 100);
            break;
        default:
            Mojo.Log.info("mySlider error value: ", event.value);
            break;
    }
}; 
于 2011-05-10T17:54:33.300 に答える