f: ajax та входи всередині ui: repeat - чому не називають getter?

Мені важко зрозуміти, чому мої геттери не називаються, коли я очікував їх всередині ui: повторіть. Я використовую Glassfish 3.1.1/Mojarra 2.1.3.

Нижче вказаний код перетворить таблицю на зразок

Alice [empty input] [empty output]  [link: update value] [link: cancel]
Bob   [empty input] [empty output]  [link: update value] [link: cancel]

Якщо я натискаю значення "update value" в рядку "Аліса", а потім "update value" в рядку "Bob", я закінчуся наступним чином:

Alice [Alice] Alice
Bob   [Alice] Bob

Я не розумію, чому вихід на рядок "Боб" збирає "Аліса". Це нагадує, що getter не викликається під час фази відтворення, а замість цього стара величина з керованого компонента приклеюється до UIInput у фазі значень параметра update-model.

Що дивно, якщо я натискаю "значення оновлення" в рядок Аліси, , потім "скасую" , а потім "оновіть значення" в рядку "Боб", я отримаю очікуваний результат.

Крім того, якщо я додаю @form у render = ... за посиланням "update value", я побачу правильні значення (хоча вони будуть дублюватися в кожному рядку). Мені це не дуже подобається, перш за все тому, що я не хочу оновлювати всю таблицю для обробки одного рядка.

Що може викликати це? Що мені не вистачає у життєвому циклі JSF?

Також - однакова модель працює чудово поза межами UI: повторіть. У цьому випадку, h: inputText, здається, завжди оновлюється з правильним значенням з керованого компонента, викликаючи getter у фазі "render response", як я очікую.

Це було спочатку з використанням PrimeFaces p: commandLink, але я отримую точно таку ж поведінку з стандартними JSF h: commandLink і f: ajax.

Також я знаю про редактор рядків PrimeFaces, і це, можливо, краще вирішити загальну загальну проблему - я все ще хочу зрозуміти, чому це не працює.

Дякую!

Відповідний XHTML виглядає наступним чином


    <table style="width:400px; ">
    
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>
            
                
                Update value
            
            
                
                Cancel
            
        </td>
    </tr>
    
    </table>

Контрольований бен "testBean" - це область видимості:

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ViewScoped
@ManagedBean
public class TestBean implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
public static class Customer {
    private String name;

    public Customer(String name) {
        this.name = name;
    }

    public String getName() {
        System.out.println("returning name: " + name);
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

private List customers;
private Customer customerEdit = new Customer(null);

@PostConstruct
public void init() {
    customers = Arrays.asList(new Customer("Alice"), 
            new Customer("Bob"), new Customer("Carol"), new Customer("David"), new Customer("Eve"));
}
public Customer getCustomerEdit() {
    return customerEdit;
}
public void setCustomerEdit(Customer customerEdit) {
    this.customerEdit = customerEdit;
}

public void edit(int index) {
    System.out.println("Called edit with index: " + index);
    customerEdit = new Customer(customers.get(index).getName());
}

public void save(int index) {
    System.out.println("Called save with index: " + index + " new name = " + customerEdit.getName());
    customers.set(index, customerEdit);
    customerEdit = null;
}

public void cancel() {
    System.out.println("Called cancel");
    customerEdit = null;
}
public List getCustomers() {
    return customers;
}
public void setCustomers(List customers) {
    this.customers = customers;
}
}
1

1 Відповіді

Ваша проблема полягає в цьому рядку:

 

Ви не можете надсилати аргументи таким способом, як actionlisteners, це не так, як воно працює. Вам потрібно змінити цей рядок на щось на зразок:

Також я не знаю, як ваш метод "збереження" стосується чогось іншого, але це, мабуть, просто тому, що ви пропустили якийсь невідповідний код.

EDIT: Ви можете надіслати аргументи таким чином, якщо це метод JavaScript, але не для керованих бобів або щось інше в # {} тегах.

0
додано
З EL 2.2 ви можете передавати аргументи таким чином. Ця частина насправді працює - я бачу, що actionListener отримує правильні аргументи, передані за допомогою println та одного кроку. Також h: outputText оновлюється правильно - проблема унікальна для входів.
додано Автор wrschneider, джерело
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram