2012-12-27 11 views
8

den Code dieser Seite Angenommen:Wie kann ich das angeklickte Element in der Ajax-Methode erhalten?

<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> 

Und den Code einer Sitzung Managed 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. 

} 

In (1) Ich möchte die ID des Elements erhalten, die angeklickt wurde vom Benutzer. Ich kann in der Liste lstIdSelectedItems die IDs aller vom Benutzer ausgewählten Elemente sehen, aber wie kann ich die ID des Elements erhalten, auf das der Benutzer geklickt hat?

Ich habe versucht, das f: Attribut-Tag innerhalb der SelectManyCheckbox zu verwenden, aber das Attribut ist nicht in der Komponentenzuordnung, wenn die Ajax-Listener-Methode in der Backed Bean aufgerufen wird. Ich habe das benutzt, aber funktioniert nicht:

<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> 

Irgendwelche Ideen?

Grüße.

Antwort

11

Sie interessieren sich also für die tatsächliche Wertänderung und nicht nur für den neuen Wert. Bring in eine valueChangeListener, die den alten Wert mit dem neuen Wert vergleicht und einige Eigenschaften vorbereitet, auf denen die Ajax-Listener-Methode abfangen könnte.

z.

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

mit

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

Wenn in der Liste "selectedItems" Sie das Endglied nicht angehakt, den Code kein Aufruf der Methode itemSelected.

+0

Eine Antwort dieser Brief gehört als Kommentar zum OP ... Bitte beachten Sie auch, dass diese Frage vor vier Jahren gestellt wurde und eine akzeptierte (und gründliche) Antwort hatte. – kwishnu