0

別の ui:define にある 2 つのフォーム間でパラメーターを渡す必要があります。

左部分がツリーテーブルで、中央部分がフォームである Web サイトがあります。左側のノードをクリックし、その ID を後で使用する中央部分に渡したいと思います。

目標は、ユーザーが左側のツリーテーブルに新しいカテゴリを追加できるようにすることです。そこで、ユーザーがツリーテーブルの「+」記号をクリックすると、それまで非表示だったフォームが表示されるというアイデアを思いつきました。

レイアウトのメイン部分です。

        <p:layoutUnit position="west" size="600" header="Categories" resizable="true" closable="false" collapsible="true">
            <h:form>
                <ui:insert name="westContent">West default content</ui:insert>
            </h:form>
        </p:layoutUnit>

        <p:layoutUnit position="center">
            <h:form>
                <ui:insert name="centerContent">Center default content</ui:insert>
            </h:form>
        </p:layoutUnit>

これは、treetable がある左側のコンテンツです。centerContent にある別のフォームに document.id を渡したいです。

<ui:define name="westContent">
    <h:form id="form">

        <p:treeTable value="#{documentsController.root}" var="document"
                     selection="#{documentsController.selectedNodes}" selectionMode="single">

            <p:column style="width:300px">
                <f:facet name="header">
                    Name
                </f:facet>
                <h:outputText value="#{document.name}" />
            </p:column>

            <p:column style="width:20px">
                <f:facet name="header">
                    Add Category
                </f:facet>
                <p:commandButton value="+" styleClass="ui-priority-primary"
                                 actionListener="#{editorBean.print}"
                                 onclick="addCategory.show();">
                </p:commandButton>

            </p:column>

        </p:treeTable>

    </h:form>
</ui:define>

これは、document.id を渡す中心のコンテンツです。

<ui:define name="centerContent">
    <h:form id="addCategoryForm">
        <p:panel id="addCategory" widgetVar="addCategory" header="New Category" style="margin-bottom:10px;" closable="true" visible="false">
            <p:messages id="messages" />
            <h:panelGrid columns="3">
                <h:outputLabel for="name" value="Name: *" />
                <p:inputText id="name" value="#{editorBean.name}" required="true" label="Name">
                    <f:validateLength minimum="2" />
                </p:inputText>
                <p:message for="name" />

                <h:outputLabel for="description" value="Description: *" />
                <p:inputText id="description" value="#{editorBean.description}" required="true" label="Description"/>
                <p:message for="description" />
            </h:panelGrid>
            <h:panelGrid columns="1">
                <h:outputLabel value="Html" />
                <pe:ckEditor id="editor" value="#{editorBean.html}" interfaceColor="#cccccc" />

                <p:commandButton id="submitButton" value="Submit" update="addCategoryForm" 
                                 icon="ui-icon-disk" actionListener="#{editorBean.print}" />
            </h:panelGrid>
        </p:panel>
    </h:form>
</ui:define>

これは、私が使用しているマネージド Bean の構造です。

@ManagedBean
@Scope("view")
public class EditorBean {

    private String name;
    private String description;
    private String html;
    private boolean isCategory;
    private int id;

}

私はjspとコンストラクターで物事を処理する古いスタイルで作業することに慣れているので、これは私にとってかなり混乱しています。この問題に対する他の解決策を受け入れます。

ツリーテーブルの ID を EditorBean に入力し、後で残りを入力できると思ったのですが、うまくいかないようです。

返信ありがとうございます

4

1 に答える 1

0

左のフォームからコマンド ボタンで現在選択されているドキュメントを保持し、右のフォームから任意の方法でアクセスできるようにするプロパティを Bean に設定するだけです。

たとえば、Bean にプロパティを追加します。

private Document selected;//getter + setter

コマンド ボタンのアクション メソッド (EL 2.2 以上)、または<f:setPropertyActionListener>(EL 2.2 未満) を使用して事前に設定します。onclickまた、AJAX コールバック イベントをフックする場所が間違っていることに注意してくださいoncomplete。代わりに次を使用してください。

<p:commandButton value="+" styleClass="ui-priority-primary"
                 actionListener="#{editorBean.print}"
                 action="#{editorBean.action(document)}"
                 oncomplete="addCategory.show();">
</p:commandButton>

public void action(Document document) {
    selected = document;
    //other business logic
}

また:

<p:commandButton value="+" styleClass="ui-priority-primary"
                 actionListener="#{editorBean.print}"
                 oncomplete="addCategory.show();">
    <f:setPropertyActionListener target="#{editorBean.selected}" value="#{document}" />
</p:commandButton>

このようにして、現在クリックされている項目が Bean で使用可能になります。必要に応じて、アクション メソッドで分解できます。他のフォームから参照することができ、他のフォームの ID を AJAX 更新に含めることができるため、これらの変更が反映されます。

于 2013-07-23T08:23:09.430 に答える