Привязать виджет слайдера 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;
}
};