如何将整数输入值绑定到滑块

How to bind integer Input value to Slider

我想要一个 Slider 和一个 Input 控件,两者都对应一个特定值。

用户应该能够使用输入字段或滑块来输入他的值。

如果用户更改滑块上的值,输入字段应显示滑块的值。如果用户在输入字段中输入内容,滑块应移动到相应的值。
目前,我正在创建一个 JSONModel,其值为 属性 以绑定:

let model = new JSONModel({
  valueName: 10
});
settings.setModel(model);

现在,当我更改滑块上的值时,输入字段的更新工作正常。但是,如果我在输入字段中输入一个值,滑块 不会 移动到该值。

为什么会这样,我该如何解决我的问题?

<Slider value="{/valueName}" step="10" width="200px" />
<Input value="{/valueName}" type="Number" width="50px" />

由于给定的解决方案仅适用于整数值,因此创建了浮点值的后续问题

起初我对此感到困惑。原因似乎是该值保存为字符串(尽管您明确指定了数字或明确地将初始模型中的值绑定到数值)。 我通过处理输入的 liveChange 事件、检索 valueName 的模型值、对该值执行 parseInt 然后将 Slider 设置为该值来检查这一点。 这会导致滑块在我更改输入时更新。

控制器:

handleChange: function(){
    var slider = this.getView().byId("slider");
    var val = this.getView().getModel().getProperty("/valueName");
    slider.setValue(parseInt(val));
}

XML 查看:

<Slider id="slider" value="{/valueName}" min="0" max="100" step="10" width="200px" />
<Input textAlign="Center" value="{/valueName}" type="Number" width="50px" valueLiveUpdate="true" liveChange="handleChange"/>

需要注意的是,如果我想将滑块更新为 70,我需要先输入 0(因为滑块设置会在我立即将值转换为最小值 (0) 或 10输入一个数字 - 给定 liveUpdate 的正确行为)。有很多方法可以解决这个问题,但我想我会给你答案,你可以从那里弄清楚该怎么做。

最终我认为这是一个错误。 编辑 - 这不是错误 - 请参考此答案下方 Boghyon 的评论

The user should be able to use either the input field or the slider to input his value.

如果您不知道,您可以使用内置的工具提示输入功能:

<Slider
  showAdvancedTooltip="true"
  showHandleTooltip="false"
  inputsAsTooltips="true"
/>

给你这个:

滑块等待 type float.

的值

然而,输入字段将输入计算为 字符串

您可以通过将适当的 type 分配给绑定信息对象以声明方式解决它:

  • Eithersap/ui/model/type/String* 分配给 Slider 的 value 绑定类型 ⇒ 将模型中的字符串值格式化为 float 在将值传递给滑块之前键入。
    由于与 String 类型的双向绑定,从 Slider 操作的浮点值将转换回 string 值,然后将其存储在模型中。
  • sap/ui/model/type/Float* 分配给输入的 value 绑定类型 ⇒ 将值存储为 number模型。然后 Slider 可以直接使用数字值。

这是上述方法的演示:https://jsbin.com/sodihub/edit?js,output

在绑定中使用 type 功能将允许 解析 格式化 ,甚至 验证 更新控件前的模型值,同时仍保持双向数据绑定模式。


* 如果与 ODataModel 绑定,需要 sap/ui/model<strong>/odata</strong>/type/<strong>Decimal</strong> |<strong>String</strong> 改为!