2012-03-20 23 views
1

我想保存inplace的值,如果它已更改。保存已更改的值从PrimeFaces inplace

当我点击保存按钮时会调用methode employeeController.save()。但我怎样才能传递新旧价值呢?我想这样做,所以我可以知道在不询问数据库的情况下是否更改了值。

<h:panelGrid id="display" columns="2" cellpadding="4" 
          style="width:300px;" 
          styleClass="ui-widget-content" 
          columnClasses="label, value"> 

        <h:outputText value="ID:" /> 
        <h:outputText id="ID" value="#{emp.id}" /> 

        <h:outputText value="Voornaam:"/> 
        <p:inplace id="firstnam" editor="true"> 
         <p:ajax event="save" onsuccess="#{employeeController.saveName()}"> 
         </p:ajax> 
         <p:inputText id ="firstName" value="#{emp.firstName}" 
            required="true" label="text"/> 
        </p:inplace> 

回答

6

那里有valueChangeListener是。

E.g.

<p:inputText ... valueChangeListener="#{employeeController.firstNameChanged}" /> 

public void firstNameChanged(ValueChangeEvent event) { 
    Object oldValue = event.getOldValue(); 
    Object newValue = event.getNewValue(); 
    // ... 
} 

你可以设置一个boolean有或收集一些其他属性的值,并在实际行动命令的方法进一步处理。

该方法只有在值被真正改变时才被调用。即使它只是从null空字符串。当旧值为equals()时,不会调用新值。

1

在M情况下,我不能使用事件=“保存”,所以我用号码:事件事件=“valueChange”。在managedBean中我有属性,它将被修改,对象拥有者这个属性。我看到很多人用事件=“拯救”但对我来说这种情况下抛出的呈现视图的错误,为此我使用valueChange

代码视图

<p:column> 
<p:inplace id="inplaceNombre" emptyLabel="#{registro.usuario.nombre}" editor="true"> 
    <p:inputText id="nombre" required="true" 
       requiredMessage="#{msg['editar.nombre.required']}" 
       alt="#{msg['editar.alt.nombre']}" title="#{msg['editar.title.nombre']}" 
       tabindex="1" value="#{registro.nombre}" 
       styleClass="#{component.valid ? '' : 'invalid'}" maxlength="30"> 

       <f:validateBean for="nombre" /> 
      <p:ajax event="valueChange" update="@this messageNombre" /> 
    </p:inputText>       
    </p:inplace>           
</p:column> 

      <p:row> 
    <p:column> 
    <p:commandButton value="#{msg['editar.value.enviar']}" 
        title="#{msg['editar.title.enviar']}" alt="#{msg['editar.alt.enviar']}" 
        actionListener="#{registro.actualizarUsuario}" tabindex="7" /> 
    </p:column> 
     </p:row> 

managedBean代码

  //property that can be modified in the User 
      @Size(min=5 ,max=30 ,message="Este campo no es correcto: tamaño máximo [30]") 
     @Pattern(regexp="^[a-zA-Z]+[a-zA-Z ]+",message="Este campo no es correcto") 
     private String nombre; 

      //User get by database with f:event type=preRenderView in xhtml view 
      private Usuario usuario; 

然后,我检查更改和更新用户。

亲切的问候。

+1

的'事件=“valueChange”'是的方式是所有UIInput组件的默认事件。您可以安全地忽略该属性。 – BalusC 2012-05-28 11:52:20

+0

我不知道这种行为。为什么我不能使用event =“save”?我看到代码在标记p:ajax中有这种行为,但在我的情况下,视图不渲染,因为它不承认这个事件。 – 2012-05-28 12:19:22

+0

我不知道。也许OP尝试了随机事件名称,并在他的问题中意外地留下了一个假名字。 – BalusC 2012-05-28 12:20:21

3

通用解决方案:存储原始数据对象,提供修改副本。

您将永远可以说出自上次保存以来。在价值变化听众的情况下,只有当价值自上次提交以来发生变化时才会知道,但这并不总是相同的。

记住旧值是一个很好的做法,因为你可以轻松地恢复用户界面中所做的更改,检查是否更新到数据库确需等