JSF (и PrimeFaces) Как передать параметр в метод в ManagedBean - PullRequest
2 голосов
/ 21 марта 2012

У меня есть объект Employee, который я показываю во входном тексте.Например, имя сотрудника отображается во входном тексте.Когда значение этого имени изменяется, он вызывает метод.Прежде чем это сделать, я хочу вызвать метод, который сохраняет идентификатор сотрудника в управляемой бобе, чтобы я знал, какого сотрудника необходимо изменить.Как мне это сделать, я получил это до сих пор:

<h:outputText value="First name:"/>
<p:inplace id="firstname" editor="true">
     <p:ajax event="save" onsuccess="#{employeeController.saveName()}"/>
     <p:inputText id="firstName" value="#{emp.firstName}"  
                  required="true" label="text"
                  valueChangeListener="#{employeeController.firstNameChanged}">
     <p:ajax event="valueChange" listener="#{employeeController.onValueChangedStart}"/>
     </p:inputText>
</p:inplace>

Я думаю, я должен передать идентификатор с помощью метода onValueChangedStart или firstNameChanged.Как мне это сделать?Или есть лучший способ сделать это?Есть добытчик для emp.Итак, # {emp} .id, чтобы получить его.

Ответы [ 3 ]

11 голосов
/ 21 марта 2012

Предполагая, что вы действительно находитесь внутри повторяющегося компонента, где #{emp} предоставляется его атрибутом var, вы можете просто извлечь его из области видимости EL внутри слушателя изменения значения следующим образом:

FacesContext context = FacesContext.getCurrentInstance();
Employee employee = context.getApplication().evaluateExpressionGet(context, "#{emp}", Employee.class);
Long id = employee.getId();
// ...

В качестве альтернативы, если вы оберните value из <h:dataTable> в DataModel<Employee>, то вы можете получить текущую строку следующим образом:

Employee employee = model.getRowData();
Long id = employee.getId();
// ...

Не связано с конкретной проблемой, нет необходимости иметь два метода слушателя для изменения значения. Обратите внимание, что valueChangeListener дает вам возможность получить как старое, так и новое значение по событию, а p:ajax listener нет, новое значение уже установлено в качестве значения модели в этой точке. Если вам нужно как старое, так и новое значение, удалите атрибут listener <p:ajax>. Кстати, event="valueChange" уже является событием по умолчанию, поэтому просто удалите его.

5 голосов
/ 21 марта 2012

Используя простые символы ajax, вы можете получить значение ввода в java, выполнив:

public void onValueChanged(AjaxBehaviorEvent event)
{
    Employee employee = (Employee)((UIOutput)event.getSource()).getValue();
    //...
}

<h:selectOneMenu required="true"
    value="#{empl}" converter="#{bean.employeeConverter}">
    <f:selectItems value="#{bean.employees}" var="varEmployee" 
        itemLabel="#{varEmployee}" itemValue="#{varEmployee}"/>
    <p:ajax event="change" listener="#{bean.onValueChanged}"/>
</h:selectOneMenu>

Вместо приведения к сотруднику вы приводите к String, поскольку ваше значение является String, или используете Object employee и используетеконвертер или его метод toString ().

1 голос
/ 23 марта 2012

1001 * попробовать *

<p:ajax event="save" onsuccess="#{employeeController.saveName(emp.id)}"/>
...