3

在 webOS 应用程序中,我有一个Mojo.Widget.Slider用于将整数设置为 0、1 或 2 的值。我自己已经负责对 Slider 值进行四舍五入(尽管有一个功能可以为您执行此操作,但我停止使用它如果这是我的问题的根源,但不是),但我希望 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似乎并没有做任何事情,尽管文档和示例代码表明这可以工作。任何想法为什么我的代码不起作用以及我可以做些什么来达到预期的效果?

注意:我知道我可以使用不同的小部件来实现这种事情,但我想用 Slider 来做。如果我找不到让这个工作的方法,使用其他东西是我的备份。

4

1 回答 1

3

问题似乎是小部件的 handleModelUpdate 中的检查。有一个标志 (this.seeking) 可防止小部件在拖动过程中处理模型更改。当小部件上发生“drop”时,该标志被清除,但 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;
    }
}; 
于 2011-05-10T17:54:33.300 回答