0

私は次のスニペットを持っています(内部h:body->h:formh:head使用されています):

<p:dataTable id="items" value="#{faNav.faRequest.items}" var="_item" emptyMessage="#{dict['web.faRequest.noItems']}">
    <p:column>
        <h:inputText id="newItemName" value="#{_item.name}" rendered="#{_item.name eq null}"/>
    </p:column>
    <p:column>
-->         <p:spinner id="newItemQuantity" value="#{_item.quantity}"/>
    </p:column>
    <p:column>
        <p:commandButton value="Añadir" update="items" actionListener="#{faNav.addItem}" rendered="#{_item.name eq null}"/> 
    </p:column>
</p:dataTable>

そしてBeanの機能:

public void addItem(ActionEvent actionEvent) {
    System.out.println("Añadiendo");
    this.faRequest.getItems().add(new RequestItem());       
}

ここで、デバッガーを使用して、関数内の値を確認します。そこでは、nameプロパティはフォームからの値で更新されていますが、quantity整数は更新されていません。数量にゼロ以外のデフォルト値を設定すると、フォームに正しく表示されるため、プロパティは名前です。

JBoss 7.1でPrimefaces 3.4.2を使用しています

私は何が欠けていますか?前もって感謝します。

更新: から<p:spinner>に切り替えて<h:inputText>も、まったく役に立ちません。

4

1 に答える 1

0

わかりました。primefaces には問題はありませんでしたが、rendered属性には問題がありました。

私が手に入れた小さいSSCCEは

index3.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head/>
<h:body>
<h:form>
    <h:column>
        <h:inputText id="newItemName" value="#{faNav.item.name}"/>
    </h:column>
    <h:column>
        <h:inputText id="newItemQuantity" value="#{faNav.item.quantity}" rendered="#{faNav.item.name eq null}"/>
    </h:column>
    <h:column>
        <h:commandButton value="Añadir" actionListener="#{faNav.setItem}" rendered="#{!faNav.item.containsData}"/> 
    </h:column>
</h:form>
</h:body>
</html>

fixedAssetNav.java

@ManagedBean(name="faNav")
@ViewScoped
public class FixedAssetNav implements Serializable {

RequestItem item = new RequestItem();

public RequestItem getItem() {
    return this.item;
}

public void setItem(RequestItem item) {
    this.item = item;
}

public void setItem(ActionEvent actionEvent) {
    this.item.setContainsData(true);
    System.out.println("Setting " + this.item.getName() + " " + this.item.getQuantity());
}
}

RequestItemnameは、2 つの文字列属性 (およびquantity) とブール値 ( )を持つ単純な BeancontainsDataです。

.xhtml のフィールドの順序を変更することで (newItemQuantity前に移動newItemName)、問題が解決したことがわかりました。また、のrendered属性を削除しnewItemQuantityたり、式を変更したりすることtrueもできました)。

私の推測では、値を適用するときの手順は次のとおりです。

1)newItemNameレンダリングされたかどうかを確認します。2) 属性nameが更新された場合。3) レンダリングされたかどうかを確認newItemQuantityします。4) レンダリングされた場合、属性quantityが更新されます。

しかし、ステップ 3でモデルを更新したfaNav.item.name eq nullに式 ( )をチェックしたため、突然 false になり、ステップ 4 はスキップされました。

これを解決するより便利な方法は、属性のフェーズをチェックすることです。

        <h:inputText id="newItemQuantity" value="#{faNav.item.quantity}" rendered="#{(faNav.item.name eq null) || (facesContext.currentPhaseId.ordinal ne 6)}"/>
于 2012-12-20T14:22:22.907 に答える