Привязать виджет слайдера WebOS к целым числам

В приложении 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 кажется, ничего не делает, хотя документация и пример кода показывают, что это может работать. Есть идеи, почему мой код не работает и что я могу сделать, чтобы достичь желаемого эффекта?

Примечание: я знаю, что могу добиться такого рода вещей, используя разные виджеты, но я бы хотел сделать это с помощью ползунка. Использование чего-то еще - моя резервная копия, если я не могу найти способ заставить это работать.

1 ответ

Решение

Проблема заключается в проверке в handleModelUpdate виджета. Есть флаг (this.seeking), который не позволяет виджету обрабатывать изменения модели во время перетаскивания. Этот флаг сбрасывается, когда "выпадение" происходит в виджете, но событие propertyChange запускается за 2 строки до того, как флаг сбрасывается.

Решение может быть таким же простым, как добавление очень короткого тайм-аута, чтобы текущее выполнение скрипта могло завершиться до того, как вы снова обновите модель.

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;
    }
}; 
Другие вопросы по тегам