2012-12-27 12 views
8

このページのコードとしますクリックしたアイテムをajaxメソッドで取得するにはどうすればよいですか?

<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を管理する:(1)私がクリックされた要素のIDを取得したいと思いで

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. 

} 

ユーザーによって。 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> 

アイデアはありますか?

よろしくお願いいたします。

答えて

11

したがって、新しい値だけでなく、実際の値の変更にも興味があります。 valueChangeListenerを持ってきて、古い値と新しい値を比較し、ajaxリスナメソッドが傍受できるいくつかのプロパティを準備します。

など。リストに "selectedItemsのは、" あなたが最後の要素、コード方法はitemSelectedなしコールをオフに

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

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

+0

答えはこのOPのコメントに属しています...この質問は4年前に尋ねられ、受け入れられた(そして徹底的な)回答がありました。 – kwishnu

関連する問題