有一个列表框(例如列表框A)包含值,如果我单击一个按钮(例如按钮X),它会将选定的值添加到另一个列表框(例如列表框B)。在此操作之后,列表框B将显示选择值。
在列表框B中(假设它有来自列表框A的值),如果我单击另一个按钮(例如按钮Y),则从列表框B中选择的值返回到列表框A
我按照这篇文章的答案并尝试将代码应用于列表框。
当我运行它时,我可以从列表框A中添加值(仅限单个值)。但我不能将值从列表框B移动到列表框A。我认为原因可能与不同的范围变量有关:列表框A使用视图范围变量和列表框B使用会话范围变量。
我在stackoverflow中搜索了列表框中关于交换范围变量的各种帖子,但我仍然没有这个想法。
我发布代码是因为它很有用。谢谢你的帮助。
<xp:table style="width:500.0px"><xp:tr><xp:td>B list box </xp:td>
<xp:td></xp:td>
<xp:td>A list box </xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:listBox id="listBox5" value="#{sessionScope.BLstBoxItem}" style="width:100.0px">
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:if (!viewScope.selectItems)
{
viewScope.selectItems = ["a","c","g"];
}
return viewScope.selectItems;}]]></xp:this.value>
</xp:selectItems>
</xp:listBox></xp:td>
<xp:td>
<xp:button id="button4" style="width:250.0px">
<xp:this.value><![CDATA[<------ Values move to B list box]]> </xp:this.value>
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
viewScope.selectItems.add(viewScope.ALstBoxItem);
viewScope.ALstBoxItem = "";
/*
for(var i in ALstBoxItem){
i--
}
return ALstBoxItem;
*/}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button id="button2" style="width:250.0px">
<xp:this.value><![CDATA[Values move to A list box ------>]]></xp:this.value>
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
sessionScope.selectItems.add(sessionScope.BLstBoxItem);
sessionScope.BLstBoxItem = "";
/*
for(var i in LLstBoxItem){
i--
}
return BLstBoxItem;
*/}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:td>
<xp:td>
<xp:listBox id="listBox4"
value="#{viewScope.ALstBoxItem}" style="width:100.0px">
<xp:selectItem itemLabel="a"></xp:selectItem>
<xp:selectItem itemLabel="b"></xp:selectItem>
<xp:selectItem itemLabel="c"></xp:selectItem>
<xp:selectItem itemLabel="d"></xp:selectItem>
<xp:selectItem itemLabel="e"></xp:selectItem>
<xp:selectItem itemLabel="f"></xp:selectItem>
<xp:selectItem itemLabel="g"></xp:selectItem>
<xp:selectItem itemLabel="h"></xp:selectItem>
<xp:selectItem itemLabel="i"></xp:selectItem>
<xp:selectItem itemLabel="j"></xp:selectItem>
</xp:listBox>
</xp:td>
</xp:tr>
</xp:table>
仅当您只想操作当前XPage中的值,而不想跨不同的浏览器选项卡或XPage设置值时,才使用视图范围变量。
单击您的按钮,您希望将从第一个列表中选择的值添加到第二个列表中,并将其从第一个列表中删除。添加值后,最好对列表进行排序。
这段代码实现了您想要的功能:
<xp:table
style="width:500.0px">
<xp:tr>
<xp:td>B list box</xp:td>
<xp:td></xp:td>
<xp:td>A list box</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:listBox
id="listBox5"
value="#{viewScope.BLstBoxItem}"
style="width:100.0px"
multiple="true">
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:
if (!viewScope.BselectItems) {
viewScope.BselectItems = ["a","b","c"];
}
return viewScope.BselectItems;
}]]></xp:this.value>
</xp:selectItems>
</xp:listBox>
</xp:td>
<xp:td>
<xp:button
id="button4"
style="width:250.0px">
<xp:this.value><![CDATA[<------ Values move to B list box]]>
</xp:this.value>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
if (viewScope.ALstBoxItem) {
var sel = [].concat(viewScope.ALstBoxItem);
for (var i = 0; i < sel.length; i++) {
viewScope.BselectItems.add(sel[i]);
viewScope.AselectItems.remove(sel[i]);
}
viewScope.BselectItems.sort();
viewScope.ALstBoxItem = "";
}
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button
id="button2"
style="width:250.0px">
<xp:this.value><![CDATA[Values move to A list box ------>]]>
</xp:this.value>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
if (viewScope.BLstBoxItem) {
var sel = [].concat(viewScope.BLstBoxItem);
for (var i = 0; i < sel.length; i++) {
viewScope.AselectItems.add(sel[i]);
viewScope.BselectItems.remove(sel[i]);
}
viewScope.AselectItems.sort();
viewScope.BLstBoxItem = "";
}
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xp:td>
<xp:td>
<xp:listBox
id="listBox4"
value="#{viewScope.ALstBoxItem}"
style="width:100.0px"
multiple="true">
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:
if (!viewScope.AselectItems) {
viewScope.AselectItems = ["d","e","f","g","h","i"];
}
return viewScope.AselectItems;
}]]></xp:this.value>
</xp:selectItems>
</xp:listBox>
</xp:td>
</xp:tr>
</xp:table>
更新:代码现在也可以用于多个选择。
本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据
问题内容: 在类中声明变量(在函数外部):所有类函数都可以访问它(基本上是公共变量) 在类内的函数内声明变量:只有该函数才能访问它(在该函数范围内) 在类内的函数内部声明带有self。(变量名)的变量:所有类函数都可以访问它(这与全局变量名有何不同?) 并且由于没有私有/受保护的事物,所以所有事物都是公共的,因此可以从类外部访问所有可以从类内部访问的事物。 我还有其他细微差别应该知道吗? 问题答案
问题内容: 我想通过使用以下代码来获取全局变量中的数据: 但是问题是我只是在d3.json函数中定义了数据变量,但是没有定义。我该如何解决这个问题? 谢谢 问题答案: 由于d3请求(如)是异步的,因此最佳做法是将所有依赖于外部请求的代码包装在请求回调中,以确保该代码在执行之前可以访问数据。来自D3 docs :“异步加载数据时,依赖于已加载数据的代码通常应存在于回调函数中。” 因此,一种选择是将所
问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实
问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实
问题内容: 我有一个从或指令属性或任何其他属性中获得的字符串,我想基于此在作用域上创建一个变量。所以: 但是,如果字符串包含一个或多个点,我想将其拆分并实际上“向下钻取”到作用域中。所以应该成为。这意味着简单版本不起作用! 在读取基于字符串的变量时,您可以通过做来获得这种行为,但是在分配值时如何实现呢? 问题答案: 我发现的解决方案是使用$ parse。 “将Angular表达式转换为函数。” 如