当前位置: 首页 > 知识库问答 >
问题:

选择多个组件中项目的动态重新加载

彭衡
2023-03-14

我想实现类似于http://www.primefaces.org/showcase/ui/pprSelect.jsf的东西,但我需要一个双组合的集合,所以我把它包装在ui:重复

我需要在后端检查双组合集合中的哪个元素已更改,以及需要重新加载的内容。对于通信,如示例中所示,使用了p:ajax,但AjaxBehaviorEvent没有给我带来任何元素索引的概念(我指的是由ui生成的双组合元素的索引:repeat)

我的客户端html" target="_blank">代码,想法是每次引发ajax事件时更新bean: selectedIndex(在selectOneMenu的更改值上),并且bean: selectedIndex的值将设置为更改selectOneMenu的索引

private List<State> productStates
private int selectedIndex;
private List<Group> groups;
private Map<Integer, Collection<Device>> availableDevicesMap;
<ui:repeat var="state" value="#{bean.productStates}" varStatus="iter">

    <p:selectOneMenu id="devGroup" value="#{state.group}">  
        <f:selectItems value="#{bean.groups}"  />  
            <p:ajax  update="refreshable"  process="devGroup, @this"  listener="#{bean.refreshDevicesForState}" >
                    <f:setPropertyActionListener target="#{bean.selectedIndex}" value="#{iter.index}"/>
            </p:ajax>                                    
    </p:selectOneMenu>

    <!-- THIS WILL BE UPDATED -->
    <h:panelGroup id="refreshable">
            <p:selectManyButton  id="devices" value="#{state.devices}" >  
                <f:selectItems value="#{bean.availableDevicesMap[status.index]}"   />  
            </p:selectManyButton> 
    </h:panelGroup>
</ui:repeat>

不按预期工作的后端。不调用setProperty tyActionListener并且selectOneMenu组件没有将选定的组作为值

public refreshDevicesForState(AjaxBehaviorEvent e) {
        SelectOneMenu menu = (SelectOneMenu)e.getComponent();
    // this value is not as selected on frontend
        Group group = (Group)menu.getValue();

    // selectedIndex will not be set, so I assume that setPropertyActionListener didn't invoked
    availableDevicesMap.put(selectedIndex, group.getDevices());
}

我也尝试了下面的代码,但在我看来,这是丑陋的

// id will be grandpaId:parentId:index:myId 
String selectedIndex = IdHelper.getIdPart(e.getComponent().getClientId(), -2);
State state = productStates.get(Integer.parseInt(selectedIndex));

我在glassfish和Mojarra上使用最新的primefaces作为jsf参考实现

谢谢你的帮助

我有一个物体列表,比如说汽车

List<Car> cars

在frontent上,我对它们进行了迭代,为每辆车创建了select brand和select model组合。当用户为第四辆车选择品牌时,我想在后端知道第四辆车将被更换,我将重新加载这辆车的可用型号列表

 <ui:repeat var="state" value="#{bean.cars}" >
    <p:selectOneMenu id="brands"/>// select brand

    <p:selectOneMenu "models"/>// show available models depends on selected brand
 </ui:repeat>

在JSF世界中如何正确处理它?

共有1个答案

伯俊弼
2023-03-14

我的第一个建议是使用组转换器。SelectOneMenu无法设置自定义类,只能在转换器的帮助下设置。(例如自动完成:http://www.primefaces.org/showcase/ui/autoCompletePojo.jsf)

其次,在bean处理程序中,productStates变量已经包含(selectOneMenus的)选定值。您可以更轻松地使用它,而不是从事件中访问它。

如果selectOneMenus的值取决于State,则必须修改它:

<f:selectItems value="#{bean.groups}"  />

能够表示应显示哪些组值。

如果要调试它(不进行eclipse调试),可以使用消息,例如:

将其添加到xhtml:

<p:growl id="msgs" showDetail="true"/>

在bean中:

public refreshDevicesForState(AjaxBehaviorEvent e) {

 ...
 FacesMessage msg = new FacesMessage("Selected", "any debug info" + productStates.get(0).getGroup());  
 FacesContext.getCurrentInstance().addMessage(null, msg);  

}

根据你的mods,我修改了我的答案。我会这样做:

xhtml:

<ui:repeat var="state" value="#{bean.productStates}" varStatus="iter">

 <p:selectOneMenu id="devGroup#{iter.index}" value="#{state.group}"
        valueChangeListener="#{bean.updateSubProperty}" immediate="true">  
  <f:selectItems value="#{bean.groups}"  />  
  <f:attribute name="index" value="#{iter.index}" />
 </p:selectOneMenu>

 <p:selectOneMenu id="subDevGroup#{iter.index}">
  ...
 </p:selectOneMenu>
</ui:repeat>

豆:

 public void updateSubProperty(ValueChangeEvent vce) {
  String index = vce.getComponent().getAttributes().get("index").toString();
  int i = Integer.parseInt(index); //this is the index of the selected selectOneMenu
  ///...

  //update sub selectOneMenu
  RequestContext.getCurrentInstance().update("subDevGroup" + index);
 }
 类似资料:
  • 我有一个可以包含多个可选ID的类,该类将选择第一个可用ID并将其返回给调用方。像下面这样。 我想使用像map和orElse这样的可选方法,但在这种情况下,它会导致太多的嵌套。另外两个伪代码选项可能是。 有没有比我现有的方法更好的方法?我很想通过做香草isPresent()检查来避免嵌套。

  • 问题内容: 所以,我想用香草JS做的事情很简单,但是我使用的是AngularJS,我想知道如何在框架内以最佳方式做到这一点。我想在多个选择框中更新所选的选项。我不想添加或删除任何选项。这是我的HTML外观: 使用以下数组,我想以编程方式从此列表中选择/取消选择选项: 当我在范围中设置此数组时,我希望选择框取消选择不是蓝色或红色的任何内容,然后选择蓝色和红色。我在Google网上论坛上看到的标准回复

  • 问题内容: 我有多个地方可以在一个坐标系和另一个坐标系之间进行转换。在每种情况下,之间都有一个余弦/正弦计算,我们称它们为x,y和x’,y’。这些都是JFormattedTextFields。 如果用户输入4中的任何一个值,则将调用ActionListener。让我们将字段称为fieldx,fieldy,fieldx1和fieldy1。如果用户在fieldx或fieldy中输入任何内容,则我将设置

  • 让我知道如何完成它。 总共有3个街区。。1.标题2.导航3.主要内容。。 导航块应该是多帧的...每次你选择一个选项,它需要改变... 它必须更像一个菜单导航 导入随机导入wx 类TabPanel1(wx.面板): #---------------------------------------------------------------------- def init(自我,父): """"

  • 问题内容: 我想选择,,从多个选择其中有10个选项。我只想选择这三个选项。 HTML代码: selenium键代码: 我尝试使用此代码。使用此代码,我可以选择第一个选项,即“ P0_ENGLISH”。但是,选择第一个选项后,我得到一个错误: 问题答案: 要从 Multi Select 元素中选择多个 选项 ,可以使用 ActionChains 模拟 Control单击* ,如下所示: *

  • 问题内容: 我正在使用实质性的UI Select组件,并且试图在内部构建过滤器以仅显示与用户输入的内容匹配的项目。 我为正在开发的内容构建了一个最小的示例。 现在我的问题是,默认情况下,选择组件允许用户按下任何字母,并且如果存在第一个字母与用户输入匹配的选项,它将选择该选项。 所以,如果我有3个选项(,和)和用户类型选择部件将选择选项,我的文本字段不会改变的价值。但是,如果用户键入,则文本字段将更