2013-05-19 4 views
1

У меня есть dataTable с использованием Primefaces 3.5, как показано на рисунке below.Первичные данные DataTable не обновляют отображаемое значение с помощью кавычки, если атрибут значения <p: selectOneMenu> и <h: outputText> отличается от

enter image description here

Теперь я редактирую вторую строку с идентификатором 43, как показано в следующем image.

enter image description here

Когда я нажимаю клеща (крайний правый столбец), строка редактируется, как можно видеть в следующем picture.

enter image description here

Можно легко заметить, что название государства изменяется от xxxx до zzz, но страна по-видимому, остаются теми же, которые, как ожидается, будет обновлен до America от Germany.

Фактически, изменения были внесены в базу данных, но они, похоже, не отражаются на dataTable по завершении события rowEdit.

Чтобы следить за изменениями, внесенными в страну, необходимо перезагрузить страницу. Только когда эта страница перезагружается, она отображает правильные данные, как показано на рисунке below.

enter image description here


Это столбец, в котором перечислен ниспадающая стране.

<p:ajax event="rowEdit" listener="#{stateManagedBean.onRowEdit}" update=":form:dataTable :form:systemMessages :form:messages" process=":form:dataTable :form:systemMessages :form:messages"/> 
<p:ajax event="rowEditCancel" listener="#{stateManagedBean.onRowEditCancel}" update=":form:systemMessages :form:messages" process=":form:systemMessages :form:messages"/> 


<p:column headerText="Country" sortBy="#{state.country.countryName}" filterBy="#{state.country.countryName}" filterMaxLength="45">      
    <p:cellEditor> 
     <f:facet name="output"> 
      <h:outputText value="#{state.country.countryName}" /> 
     </f:facet> 
     <f:facet name="input"> 
      <p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" rendered="true" editable="false" converter="#{longConverter}" converterMessage="The supplied value is incorrect." required="true" requiredMessage="Select an appropriate option." style="width:100%;"> 
       <f:selectItems var="country" value="#{stateManagedBean.countries}" itemLabel="${country.countryName}" itemValue="${country.countryId}" itemLabelEscaped="true" rendered="true"/> 
      </p:selectOneMenu> 
     </f:facet> 
    </p:cellEditor> 
</p:column> 

И следующий будет onRowEdit() метод (в JSF управляемый компонент), который срабатывает, когда клещ нажата.

public void onRowEdit(RowEditEvent event) 
{ 
    StateTable stateTable=(StateTable) event.getObject(); 

    if(stateService.update(stateTable)) 
    { 
     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Success : ", "The row with the id "+stateTable.getStateId()+" has been updated successfully."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
    } 
} 

Полный код JSF managed bean и JSF page.


В методе rowEdit() (как описано выше), stateTable.getCountry().getCountryId() отображает обновленный countryId, но с помощью этого объекта страны ссылаться на имя соответствующей страны, как stateTable.getCountry().getCountryName() просто отображает старое название страны (не обновляется один). Каков способ обойти это?


Важно:

В XHTML фрагменте кода выше, значения атрибута обоих,

<h:outputText value="#{state.country.countryName}"/> 
         ^^^^^^^^^^^^^_^^^^^^^^^^^ 
<p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" .../> 
               ^^^^^^^^^^^^^_^^^^^^^^^ 

отличается, который имеет важное значение для отображения названий стран вместо отображения идентификаторов стран и ссылаясь на соответствующие идентификаторы стран.

Если они будут изменены, чтобы отразить тот же атрибут value,

<h:outputText value="#{state.country.countryId}"/> 
         ^^^^^^^^^^^^^_^^^^^^^^^ 
<p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" .../> 
               ^^^^^^^^^^^^^_^^^^^^^^^ 

затем он работает, как ожидалось (Primefaces витрина пример (ы) демонстрации (ы) так же, как это).


Это то же самое, что и обновление значения нижнего колонтитула, динамически показывающее общее число числовых значений столбца. Нижний колонтитул не обновляется при обновлении строки в этом столбце. Сообщено о проблеме here.

+1

Попробуйте следовать этому примеру http://www.primefaces.org/showcase/ui/datatableRowEditing.jsf и посмотреть, чего не хватает. – Makky

+0

В этом примере витрины значение '' и '' совпадает с значением 'value =" # {car.color} "'. Выполнение этого, также работает в моем случае (я всегда смотрю примеры демонстрации, прежде чем я начну с них). В моем случае, однако, значение как '', так и '' отличается от значения 'value =" # {state.countryId.countryName} "и' value = "# {state .countryId.countryId} "' соответственно. Это не работает должным образом. – Tiny

+0

поместите его в форму, затем обновите форму, если событие изменения выполнено. – Farnsbert

ответ

5

Проблема в том, что вы не меняете объект всей страны. Поскольку вы используете #{state.country.countryId} как стоимость p:selectOneMenu, просто свойство countryId из выбранной страны меняется, но не страна, то есть другие свойства, такие как countryName.

Вы должны изменить значение p:selectOneMenu к #{state.country} и itemValue от f:selectItems к #{country}. Посмотрите на showcase на номер p:selectOneMenu.

Кроме того, как country является POJO, для которого нет конвертер не доступен по умолчанию, вы должны реализовать countryConverter и использовать его для преобразования при выборе элемента с помощью p:selectOneMenu.

Используйте следующий код для p:selectOneMenu и этого article в качестве поддержки для реализации преобразователя.

<p:selectOneMenu id="cmbCountryMenu" value="#{state.country}" rendered="true" editable="false" converter="#{countryConverter}" converterMessage="The supplied value is incorrect." required="true" requiredMessage="Select an appropriate option." style="width:100%;"> 
    <f:selectItems var="country" value="#{stateManagedBean.countries}" itemLabel="#{country.countryName}" itemValue="#{country}" itemLabelEscaped="true" rendered="true"/> 
</p:selectOneMenu> 
+0

Прежде всего спасибо за ответ, но, к сожалению, у меня такая же проблема с этими изменениями. Кроме того, блог BalusC велик, но он использует 'List ', который, кстати, старая вещь JSF 1.x. – Tiny

+0

Нет изменений в поведении? Не могли бы вы опубликовать код созданного конвертера? Извините, я этого не видел. – user1983983

+0

Ах! Это сработало для меня. Теперь я нашел это довольно простым, но только после того, как я реализовал его. Спасибо. – Tiny