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

В приложении webOS у меня есть Mojo.Widget.Slider, который я использую для установки целого числа в 0, 1 или 2. Я уже сам позабочусь об округлении значения Slider (хотя есть функция, позволяющая сделать это для вас, но я перестал использовать это на тот случай, если это было источником моей проблемы, но это не так), но я хотел бы, чтобы ползунок привязывался к округленному целочисленному положению после того, как пользователь выполнил скольжение. Насколько я могу судить, для этого нет ничего встроенного, поэтому я должен сделать это сам. Я думал, что что-то вроде следующего будет работать.

В моей функции настройки помощника сцены:

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

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


person G Gordon Worley III    schedule 17.04.2011    source источник


Ответы (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;
    }
}; 
person ryanjduffy    schedule 10.05.2011