如何将添加到列表框客户端的值存储到sessionScope

时间:2015-02-18 12:08:09

标签: javascript jquery select xpages

我有一个列表框,其中填充了客户端选项,我需要将此列表框中的值存储到sessionScope。

这是我的列表框

<xp:listBox id="listBox1"></xp:listBox>

这是我用来填充列表框的jquery

$("[id$='listBox1']").append("<option value='"+ ret + "'>" + ret + "</option>")

这是我必须将列表框保存到sessionScope

的按钮
<xp:button value="Label" id="button1">
    <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
        <xp:this.action><![CDATA[#{javascript:sessionScope.pending = getComponent("listBox1").getValue()}]]></xp:this.action>
    </xp:eventHandler></xp:button>

由于某种原因,列表框值未保存到我的sessionScope。如果我预先在DDE中填充列表框,它可以工作,但这不是我想要的。

  • 我还尝试将listBox绑定到数据源而没有任何运气
  • 在点击按钮
  • 之前,我还尝试过选择值

如何将我填充客户端的值输入到sessionScope中。

完整代码粘贴到新的Xpage中,(您需要jquery或bootstrap主题)

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.data>
        <xp:dominoDocument var="d" formName="Main"></xp:dominoDocument>
    </xp:this.data>
    <xp:button value="ADD TO LISTBOX" id="button2">
        <xp:eventHandler event="onclick" submit="false">
            <xp:this.script><![CDATA[var ret = "Testin"
$("[id$='listBox1']").append("<option value='"+ ret + "'>" + ret + "</option>")]]></xp:this.script>
        </xp:eventHandler>
    </xp:button>
    <xp:listBox id="listBox1" value="#{sessionScope.pending}">
        <xp:eventHandler event="onchange" submit="true" refreshMode="complete"></xp:eventHandler>
    </xp:listBox>
    <xp:br></xp:br>
    <xp:br></xp:br>
    <xp:button value="save" id="button1">
        <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
            <xp:this.action><![CDATA[#{javascript:sessionScope.pending = getComponent("listBox1").getValue()}]]></xp:this.action>
        </xp:eventHandler>
    </xp:button>
    <xp:br></xp:br>
    <xp:br></xp:br>
    <xp:text escape="true" id="computedField1" value="#{sessionScope.pending}"></xp:text>
</xp:view>

2 个答案:

答案 0 :(得分:3)

这可以通过简单的RPC调用来完成。

  1. 在您的页面中添加RPC,在此示例中,我将myRPC视为服务名称。

  2. 为此RPC定义一个函数,该函数将值数组作为输入。该函数只是将此数组设置在 sessionScope 变量中。在此示例中,我将函数命名为setScopeVariable;

  3. 在构建列表框值的客户端代码之后,只需调用此RPC函数即可。这里listBoxValues是一个包含值列表的数组:     myRPC.setScopeVariable(listBoxValues);

  4. 现在,sessionScope设置为正确的值。

  5. 通过这样做,您不需要隐藏输入,也不需要刷新页面以设置sessionScope。

答案 1 :(得分:0)

这项工作按设计:

<xp:listBox
    id="listBox1"
    value="#{sessionScope.pending}">
    <xp:selectItem itemLabel="A"></xp:selectItem>
    <xp:selectItem itemLabel="B"></xp:selectItem>
</xp:listBox>
<xp:button
    value="OK"
    id="button1">
    <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="complete">
    </xp:eventHandler>
</xp:button>

我知道,它没有用JQuery填充值,但它不应该有所作为......

免责声明:模型更新可能存在问题 - 如果组件提交未通过来源定义的值 - <xp:selectItem>。这通常发生在组合框中 - 提交的值必须与XPage生成的任何值匹配。

我认为可以选择预先填充列表框选项。如果没有,请尝试解决方法:

您可以使用CSJS将所选值放入绑定到sessionScope的隐藏输入中。那个将被提交。请注意,绑定已从listBox1移至inputHiden1

<xp:button
    value="Refresh"
    id="button1">
    <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="partial"
        refreshId="inputHidden1">
        <xp:this.script><![CDATA[var lb = dojo.byId("#{id:listBox1}");
var hi = dojo.byId("#{id:inputHidden1}");
hi.value = lb.options[lb.selectedIndex].innerHTML;]]></xp:this.script>
    </xp:eventHandler>
</xp:button>
<xp:inputHidden
    id="inputHidden1"
    value="#{sessionScope.pending}">
</xp:inputHidden>

将列表框中的值复制到隐藏输入的脚本可以在listBox的onChange中运行,以避免点击按钮。

另请参阅:XPages - Client side code to set viewScope value?