1

私のJSFページでは、単純なデータベーステーブルをに表示していますdataTable。このテーブルの行を編集できるようにしたい。解決策として、最初の列の値をクリックするとダイアログがポップアップ表示されます。を使用して、バッキングBeanの現在の行/エンティティを設定しsetPropertyActionListenerます。これはうまくいくようです。ただし、ポップアップはほんの一瞬で消えます。なぜなのかわかりません。誰か提案がありますか?

これが私のdataTableのJSFコードです:(ご覧のとおり、PrimeFacesを使用しています)

<h:form id="dataForm">
    <p:dataTable value="#{misterBean.values}" var="value">
        <p:column>
            <h:commandLink value="#{value.name}" onclick="updateDlg.show()">
                <f:setPropertyActionListener
                    target="#{misterBean.value}"
                    value="#{value}" />
            </h:commandLink>
        </p:column>
        <!-- more columns -->
    </p:dataTable>
</h:form>

およびダイアログのJSFコード:

<p:dialog id="updateDialog" header="Update data" widgetVar="updateDlg">
    <h:form id="updateForm">
        <h:panelGrid columns="2" cellpadding="5">
            <h:outputLabel for="name" value="Name:" />
            <p:inputText id="name" value="#{misterBean.value.name}" />
            <h:outputLabel for="flag" value="Flag:" />
            <p:selectBooleanButton id="flag"
                value="#{misterBean.value.flag}"
                onLabel="On"
                offLabel="Off" />
            <f:facet name="footer">
                <p:commandButton id="submitButton"
                    value="Submit"
                    actionListener="#{misterBean.update}"
                    oncomplete="updateDlg.hide()"
                    update=":dataForm" />
            </f:facet>
        </h:panelGrid>
    </h:form>
</p:dialog>

バッキングBeanは次のようになります。

@Controller
@ManagedBean( name = "misterBean" )
@ViewScoped
public final class MisterBean {

    private final MyService myService;
    private final List<Value> values;
    private Value value;

    @Autowired
    public MisterBean( final MyService myService ) {
        this.myService = myService;
        this.values = this.myService.loadValues();
        this.value = new Value();
    }

    public List<Value> getValues() {
        return this.values;
    }

    public Value getValue() {
        return this.value;
    }

    public void setValue( final Value value ) {
        this.value = value ;
    }

    public void update( final ActionEvent e ) {
        this.myService.save( this.value );
        this.value = new Value();
    }

}
4

1 に答える 1

3

ダイアログが表示された直後にページが更新されている可能性がありますか? ajax=truePrimefaces commandLink はデフォルトで設定されているため、ネイティブの jsf commandLink ではなく、primefaces commandLink を使用することをお勧めします。

<h:commandLink...に変更<p:commandLink...

于 2012-10-04T15:01:16.937 に答える