Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ajax方法中获取单击的项?_Ajax_Jsf 2_Selecteditem_Selectmanycheckbox - Fatal编程技术网

如何在ajax方法中获取单击的项?

如何在ajax方法中获取单击的项?,ajax,jsf-2,selecteditem,selectmanycheckbox,Ajax,Jsf 2,Selecteditem,Selectmanycheckbox,假设此页面的代码为: <h:form prependId="false" id="form"> <h:selectManyCheckbox id="checkBoxList" value="#{backedBean.lstIdSelectedItems}" layout="pageDirection"> <f:selectItems value="#{backedBean.lstAvailableItems}" var="item" ite

假设此页面的代码为:

<h:form prependId="false" id="form">

    <h:selectManyCheckbox id="checkBoxList" value="#{backedBean.lstIdSelectedItems}" layout="pageDirection">
        <f:selectItems value="#{backedBean.lstAvailableItems}" var="item" itemLabel="#{item.label}" itemValue="#{item.value}" />
        <f:ajax listener="#{backedBean.itemClicked}" />
    </h:selectManyCheckbox>

</h:form>

以及会话管理bean的代码:

public class BackedBean implements Serializable {
   private List<SelectItem> lstAvailableItems;
   private List<Long> lstIdSelectedItems;

public BackedBean() {
    lstAvailableItems = new ArrayList<SelectItem>();
    lstIdSelectedItems = new ArrayList<Long>();
}

@PostConstruct
private void postConstruct(){
    for (int i = 0; i < 10; i++) {
        SelectItem item = new SelectItem(new Long(i), "CHKID " + i);
        lstAvailableItems.add(item);
    }
}

public void itemClicked(AjaxBehaviorEvent ae){
    HtmlSelectManyCheckbox uiCmp = (HtmlSelectManyCheckbox)ae.getSource();

    // (1) Here I would like to get the ID of the item that has been clicked.

}
public类BackedBean实现可序列化{
私有列表LSTAvableItems;
私有列表lstIdSelectedItems;
公共BackedBean(){
lstAvailableItems=newArrayList();
lstIdSelectedItems=newarraylist();
}
@施工后
构造后的私有void(){
对于(int i=0;i<10;i++){
SelectItem项目=新的SelectItem(新长(i),“CHKID”+i);
lstAvailableItems.add(项目);
}
}
已单击公共无效项(AjaxBehaviorEvent ae){
HtmlSelectManyCheckbox uiCmp=(HtmlSelectManyCheckbox)ae.getSource();
//(1)这里我想获取已单击项目的ID。
}
在(1)中,我想获取用户单击的元素的ID。我可以在lstIdSelectedItems数组列表中看到用户选择的所有元素的ID,但是如何获取用户单击的元素的ID

我曾尝试在selectManyCheckbox中使用f:attribute标记,但在支持的bean中调用ajax侦听器方法时,该属性不在组件映射中。我使用了该标记,但不起作用:

<h:selectManyCheckbox id="checkBoxList" value="#{backedBean.lstIdSelectedItems}" layout="pageDirection">
    <f:selectItems value="#{backedBean.lstAvailableItems}" var="item" itemLabel="#{item.label}" itemValue="#{item.value}">
        <f:attribute name="clicked" value="#{item.value}" />
    </f:selectItems>
    <f:ajax listener="#{backedBean.itemClicked}" />
</h:selectManyCheckbox>

有什么想法吗


关于。

因此,您对实际值更改感兴趣,而不仅仅是对新值感兴趣。引入一个
valueChangeListener
,它将旧值与新值进行比较,并准备一些ajax侦听器方法可以截取的属性

例如


私有映射可用项;//+getter
私有列表selectedItems;//+getter+setter
私有长选择项;
私有布尔selecteditemremove;
@施工后
公共void init(){
availableItems=新建LinkedHashMap();
用于(长i=0;i<10;i++){
可用项。put(“CHKID”+i,i);
}
}
public void selectedItemsChanged(ValueChangeEvent事件){
List oldValue=(List)event.getOldValue();
List newValue=(List)event.getNewValue();
if(oldValue==null){
oldValue=Collections.emptyList();
}
if(oldValue.size()>newValue.size()){
oldValue=新阵列列表(oldValue);
oldValue.removeAll(newValue);
selectedItem=oldValue.iterator().next();
selectedItemRemoved=true;
}
否则{
newValue=新数组列表(newValue);
newValue.removeAll(旧值);
selectedItem=newValue.iterator().next();
selectedItemRemoved=false;
}
}
已选择公共无效项(AjaxBehaviorEvent事件){
System.out.println(“所选项目:“+selectedItem”);
System.out.println(“已删除选定项?”+selectedItemRemoved);
}

当您在列表“selectedItems”中取消选中结束元素时,代码不调用方法项Selected。

此摘要的答案属于OP的注释。请注意,此问题也是四年前提出的,并且有一个被接受的(彻底的)答案。
private Map<String, Long> availableItems; // +getter
private List<Long> selectedItems; // +getter+setter
private Long selectedItem;
private boolean selectedItemRemoved;

@PostConstruct
public void init() {
    availableItems = new LinkedHashMap<String, Long>();

    for (long i = 0; i < 10; i++) {
        availableItems.put("CHKID " + i, i);
    }
}

public void selectedItemsChanged(ValueChangeEvent event) {
    List<Long> oldValue = (List<Long>) event.getOldValue();
    List<Long> newValue = (List<Long>) event.getNewValue();

    if (oldValue == null) {
        oldValue = Collections.emptyList();
    }

    if (oldValue.size() > newValue.size()) {
        oldValue = new ArrayList<Long>(oldValue);
        oldValue.removeAll(newValue);
        selectedItem = oldValue.iterator().next();
        selectedItemRemoved = true;
    }
    else {
        newValue = new ArrayList<Long>(newValue);
        newValue.removeAll(oldValue);
        selectedItem = newValue.iterator().next();
        selectedItemRemoved = false;
    }
}

public void itemSelected(AjaxBehaviorEvent event) {
    System.out.println("Selected item: " + selectedItem);
    System.out.println("Selected item removed? " + selectedItemRemoved);
}