Primefaces范围滑块:事件值来源识别及最值配置问题
嘿,我来帮你把这块的逻辑理清楚,结合你的代码片段来说明:
一、slideEnd事件里的值到底来自哪?
看你写的代码,滑块设置了for="min,max",这就说明这个范围滑块的左右两个端点值,会分别同步到ID为min和max的**隐藏输入框(h:inputHidden)**里。当slideEnd事件触发时,这两个隐藏框已经自动更新成用户刚选的范围值了,你有两种方式获取:
1. 直接读Bean绑定的属性
既然你把隐藏框的value绑定到了myBean.min和myBean.max(从你的代码片段能看出来),那在simuladorBean.onSlideEnd方法里,直接注入myBean然后拿它的min和max属性就行,这俩值就是滑块当前选中的范围端点,简单直接。
2. 通过事件对象拿组件值
如果想在方法里直接操作组件,就给方法加个AjaxBehaviorEvent参数,然后顺着组件树找到对应的隐藏框:
public void onSlideEnd(AjaxBehaviorEvent event) { // 拿到触发事件的滑块组件 Slider slider = (Slider) event.getComponent(); // 找到绑定的min隐藏输入 UIInput minInput = (UIInput) slider.findComponent("min"); // 找到绑定的max隐藏输入 UIInput maxInput = (UIInput) slider.findComponent("max"); // 获取当前选中的范围值 Object selectedMin = minInput.getValue(); Object selectedMax = maxInput.getValue(); // 接下来就按你的业务逻辑处理就行啦 }
注意哦,如果滑块在表单、标签页这类有命名容器的组件里,找组件的时候可能得用完整的客户端ID,或者相对路径来定位,不然容易找不到。
二、滑块的minValue和maxValue到底管啥?
你代码里的minValue="#{myBean.value1}"和maxValue="#{myBean.value2}",是用来定义滑块本身能滑动的最大范围:
minValue:滑块左端点能滑到的最小值(相当于整个滑块的左边界)maxValue:滑块右端点能滑到的最大值(相当于整个滑块的右边界)
别和你绑定的myBean.min/myBean.max搞混了:
value1/value2是滑块的固定范围上限下限,一般是初始化时设置好的(除非你要动态改)min/max是用户实际选出来的具体范围值,会跟着用户拖动滑块变化
另外你设置的displayTemplate=" {min} - {max}"和display="displayValues",是用来在页面上实时显示当前选中的范围,这里的{min}和{max}会自动替换成滑块当前的选中值,和myBean.min/myBean.max是完全同步的。
三、给你补全代码小建议
你的代码里隐藏输入框没写完,完整的应该是这样(记得都放在同一个表单里哦):
<h:form> <h:outputText id="displayValues" value="#{myBean.min} - #{myBean.max}"/> <p:slider id="mySlider" for="min,max" display="displayValues" range="true" displayTemplate=" {min} - {max}" minValue="#{myBean.value1}" maxValue="#{myBean.value2}"> <p:ajax event="slideEnd" listener="#{simuladorBean.onSlideEnd}"/> </p:slider> <h:inputHidden id="min" value="#{myBean.min}"/> <h:inputHidden id="max" value="#{myBean.max}"/> </h:form>
确保隐藏框的ID和滑块for属性里的对应上,这样值的绑定和Ajax事件才能正常工作~
内容的提问来源于stack exchange,提问作者mf8951

