xp:comboBox的onChange事件无法触发问题求助
解决xp:comboBox onChange事件不触发的问题
问题核心原因
你遇到的xp:comboBox onChange事件不触发的关键问题,出在组件设置的immediate="true"属性上。在XPages生命周期中,immediate="true"会让组件跳过模型更新阶段,用户选择的值无法同步到viewScope.xpcombo中。而原生xp:comboBox的onChange事件触发依赖于服务器检测到组件值的变更,值未更新时事件自然不会触发。而xe:djComboBox基于Dojo实现,事件处理逻辑独立于XPages的生命周期限制,因此不受immediate属性影响。
可行解决方案
根据你的使用场景,有两种修复方式:
方案1:移除不必要的immediate="true"
如果不需要跳过验证或模型更新流程,直接移除该属性即可:
<xp:comboBox id="comboBox1" style="width:130.0px" value="#{viewScope.xpcombo}" disableClientSideValidation="true"> <xp:selectItem itemLabel="" id="selectItem3"></xp:selectItem> <xp:selectItem itemLabel="Cease" itemValue="Cease" id="selectItem1"> </xp:selectItem> <xp:eventHandler event="onChange" submit="true" refreshMode="full" id="eventHandler1" disableValidators="true"> </xp:eventHandler> </xp:comboBox> <xp:text id="computedField1"> <xp:this.value><![CDATA[#{javascript:var req = getComponent("comboBox1").getValue(); if( req == "Cease") {return "Some cease text frome combBox1";} }]]></xp:this.value> </xp:text>
方案2:保留immediate并调整事件执行模式
若必须保留immediate="true",可给eventHandler添加execMode="partial"并指定执行组件,强制服务器处理该组件的事件:
<xp:comboBox id="comboBox1" style="width:130.0px" value="#{viewScope.xpcombo}" disableClientSideValidation="true" immediate="true"> <xp:selectItem itemLabel="" id="selectItem3"></xp:selectItem> <xp:selectItem itemLabel="Cease" itemValue="Cease" id="selectItem1"> </xp:selectItem> <xp:eventHandler event="onChange" submit="true" refreshMode="full" id="eventHandler1" disableValidators="true" execMode="partial" execId="comboBox1"> </xp:eventHandler> </xp:comboBox>
验证效果
修改后,选择"Cease"选项时,xp:comboBox的onChange事件会正常触发,服务器能获取到组件值,computedField1也会正确显示对应文本。
内容的提问来源于stack exchange,提问作者Mark Maden
相关产品推荐
相关产品推荐

