2012-03-21 2 views
2

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

<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, чтобы получить его.

+0

ли это внутри DataTable? '# {Emp}' не является свойством '# {employeeController}', который на первый взгляд довольно странный. – BalusC

+0

Это внутри данных. Так что ответ, который вы давали, был полезен – Klaasvaak

ответ

11

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

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", кстати, уже по умолчанию, поэтому просто удалите его.

+0

Спасибо, вот что мне нужно! – Klaasvaak

+0

Знаете ли вы, можно ли снова отобразить место на месте? Он по-прежнему показывает старое значение. – Klaasvaak

+0

Используйте атрибут обновления ajax для его обновления. – djmj

5

Использования primefaces 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> 

Вместо приведения служащих вы приведение к строке с момента значения является строка, или использовать объект сотрудника и использовать Конвертер или его метод toString().

1

попробовать

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