ajax - 如何在ajax方法中获取点击的项目?

标签 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" itemLabel="#{item.label}" itemValue="#{item.value}" />
        <f:ajax listener="#{backedBean.itemClicked}" />
    </h:selectManyCheckbox>

</h:form>

session 管理 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.

}

在(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 监听器方法可以拦截的属性。

例如

<h:selectManyCheckbox value="#{bean.selectedItems}" valueChangeListener="#{bean.selectedItemsChanged}" converter="javax.faces.Long">
    <f:selectItems value="#{bean.availableItems}" />
    <f:ajax listener="#{bean.itemSelected}" />
</h:selectManyCheckbox>

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);
}

关于ajax - 如何在ajax方法中获取点击的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14060246/

相关文章:

javascript - JQuery 模糊和隐藏导致过度触发

java - JSF:是否可以为此创建一个自定义转换器

internet-explorer - 使用 SSL 与 JBoss AS7 的连接中断(Richfaces 页面)

c# - 来自所选联系人的 Outlook 信息

javascript - XMLHttpRequest 无法加载。 。 。请求的资源上不存在 'Access-Control-Allow-Origin' header 。

javascript - 如何将 JQuery 导入 Typescript 文件?

c# - jQuery AJAX 总是执行错误 : {}

java - 最简单的 JSF 2.0 应用程序将无法运行

wpf - DisplayMemberPath 的 ComboBox 样式问题

c# - 将 WPF Combobox 的 SelectedItem 转换为 Color 会导致异常