2012-12-27 15 views
8

Załóżmy kod tej strony:Jak mogę uzyskać klikniętą pozycję w metodzie 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> 

i Kodeksu sesji udało fasola:

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. 

} 

W (1) Chciałbym uzyskać identyfikator elementu, który został kliknięty przez użytkownika. Widzę w tablicy lstIdSelectedItems listę identyfikatorów wszystkich elementów wybranych przez użytkownika, ale jak mogę uzyskać identyfikator elementu klikniętego przez użytkownika?

Próbowałem użyć tagu f: attribute wewnątrz selectManyCheckbox, ale atrybut nie znajduje się na mapie komponentu, gdy wywoływana jest metoda ajax detektor w komponencie bean. Użyłem tego, ale nie działa:

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

Jakieś pomysły?

Pozdrawiam.

Odpowiedz

11

W ten sposób interesuje Cię faktyczna zmiana wartości, a nie tylko nowa wartość. Wprowadź wartość valueChangeListener, która porównuje starą wartość z nową wartością i przygotowuje pewne właściwości, na które może przechwycić metodę ajax listenener.

E.g.

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

z

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

Kiedy na liście "selectedItems" ty niezaznaczone element końcowy, kod nie wywołać metodę itemSelected.

+0

Odpowiedź w tym skrócie należy traktować jako komentarz do OP ... proszę zauważyć, że pytanie to zadano cztery lata temu i otrzymałem akceptowaną (i dokładną) odpowiedź. – kwishnu

Powiązane problemy