xp:dataContext 变量是只读的吗?
Are xp:dataContext variables read-only?
根据我在 Mastering XPages 一书中和网络上看到的示例,xp:dataContext
变量应该是可写的,但我无法让它工作。
下面是我的代码的简化版本。按钮调用包含 panel
的 xe:dialog
和 dataContext
变量 attended 和初始值 "",期望能够写入它来自 radioGroup
数据绑定。当收音机设置为某个值时(在本例中为 != "Yes"
),我想取消隐藏 div
但它不起作用。 div 不会出现,并且 txt1 计算文本字段永远不会更改以反映单选按钮的值。
我已经尝试了 onclick
和 onchange
事件处理程序,但似乎都没有效果。 dataContext
变量是只读的吗?
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:button id="btn" value="Button">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial">
<xp:this.action><![CDATA[#{javascript:getComponent('dlg').show()}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xe:dialog id="dlg" title="Dialog">
<xp:panel id="panel1" readonly="false">
<xp:this.dataContexts>
<xp:dataContext var="attended" value="" />
</xp:this.dataContexts>
<xp:radioGroup id="activityAttended" value="#{attended}">
<xp:selectItem itemLabel="Yes" />
<xp:selectItem itemLabel="No" />
<xp:selectItem itemLabel="Maybe" />
<xp:eventHandler id="event1" event="onclick" submit="true"
refreshMode="partial" refreshId="target" />
</xp:radioGroup>
<xp:div id="target">
radio: <xp:text id="txt1" value="#{attended}" />
<xp:div id="div1" rendered="#{attended != 'Yes'}">
<xp:text id="txt2" value="#{attended}" />
</xp:div>
</xp:div>
</xp:panel>
</xe:dialog>
</xp:view>
据我所知,您不能为 dataContext
分配变量名。您 可以 做的是将值绑定到 包含 另一个值的东西,例如 Map
或自定义对象,并且然后更改其属性。
例如,如果您将其设为 var="contextProps" value="${javascript:new java.util.HashMap()}"
,则您可以执行 #{contextProps.attended != 'Yes'}
和 value="#{contextProps.attended}"
之类的操作。通常,为此您需要一个比通用 HashMap
更充实的对象,但它可以作为示例或必要时的有用容器。
根据我在 Mastering XPages 一书中和网络上看到的示例,xp:dataContext
变量应该是可写的,但我无法让它工作。
下面是我的代码的简化版本。按钮调用包含 panel
的 xe:dialog
和 dataContext
变量 attended 和初始值 "",期望能够写入它来自 radioGroup
数据绑定。当收音机设置为某个值时(在本例中为 != "Yes"
),我想取消隐藏 div
但它不起作用。 div 不会出现,并且 txt1 计算文本字段永远不会更改以反映单选按钮的值。
我已经尝试了 onclick
和 onchange
事件处理程序,但似乎都没有效果。 dataContext
变量是只读的吗?
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:button id="btn" value="Button">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial">
<xp:this.action><![CDATA[#{javascript:getComponent('dlg').show()}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xe:dialog id="dlg" title="Dialog">
<xp:panel id="panel1" readonly="false">
<xp:this.dataContexts>
<xp:dataContext var="attended" value="" />
</xp:this.dataContexts>
<xp:radioGroup id="activityAttended" value="#{attended}">
<xp:selectItem itemLabel="Yes" />
<xp:selectItem itemLabel="No" />
<xp:selectItem itemLabel="Maybe" />
<xp:eventHandler id="event1" event="onclick" submit="true"
refreshMode="partial" refreshId="target" />
</xp:radioGroup>
<xp:div id="target">
radio: <xp:text id="txt1" value="#{attended}" />
<xp:div id="div1" rendered="#{attended != 'Yes'}">
<xp:text id="txt2" value="#{attended}" />
</xp:div>
</xp:div>
</xp:panel>
</xe:dialog>
</xp:view>
据我所知,您不能为 dataContext
分配变量名。您 可以 做的是将值绑定到 包含 另一个值的东西,例如 Map
或自定义对象,并且然后更改其属性。
例如,如果您将其设为 var="contextProps" value="${javascript:new java.util.HashMap()}"
,则您可以执行 #{contextProps.attended != 'Yes'}
和 value="#{contextProps.attended}"
之类的操作。通常,为此您需要一个比通用 HashMap
更充实的对象,但它可以作为示例或必要时的有用容器。