0

私のページには次のレイアウトがあります(簡略化)

<h:form>
    <h:commandButton action="#{bean.save} value="Save"/>

    <rich:tabPanel switchType="ajax">
        <rich:tab name="one" switchType="client">

        </rich:tab>

        <rich:tab name="two" switchType="ajax">

        </rich:tab>

        <rich:tab name="three" switchType="client">

        </rich:tab>

    </rich:tabPanel>
</h:form>

タブ「one」と「three」には switchType="client" があり、Bean プロパティにバインドされたいくつかの入力があります。「保存」を押すと、両方のタブの入力から Bean プロパティが更新されることを期待しています。ただし、プロパティは現在のタブの入力からのみ更新されます。フォーム全体が送信されますが、別のタブからの値は失われます (HTTP ウォッチャーで確認しました)。そのため、ユーザーは 1 つのタブにデータを入力し、[保存] を押してから、別のタブで値を更新し、[保存] を押してすべての変更を保存する必要があります。すべてのタブから一度に値を伝播するにはどうすればよいですか?

4

3 に答える 3

0

解決策が見つかりました:タブパネルのswitchTypeを「ajax」から「client」に変更しました。提案ありがとうございます!

于 2012-06-18T11:48:12.193 に答える
0

まず、送信がサーバーへの ajax リクエストによって行われるように を変更<h:commandButton />します。<a4j:commandButton />また、操作後にページのコンテンツを再レンダリングできます。

<h:form>
    <!-- RichFaces 3.3 -->
    <a4j:commandButton value="Save"
        action="#{bean.save}"
        reRender="tbpMyTabs" />
    <!-- RichFaces 4. -->
    <a4j:commandButton value="Save"
        action="#{bean.save}"
        render=":tbpMyTabs" />

    <rich:tabPanel id="tbpMyTabs" switchType="ajax">
        <rich:tab name="one" switchType="client">
        </rich:tab>
        <rich:tab name="two" switchType="ajax">
        </rich:tab>
        <rich:tab name="three" switchType="client">
        </rich:tab>
    </rich:tabPanel>
</h:form>

アクション ajax リクエストを成功させるにはSave、void を返すようにメソッドを変更して、JSF がナビゲーション ルールに従わないようにします。JSF 2 を使用している場合、Bean にはビュー スコープが必要です。それ以外の場合は、リクエスト スコープとKeepAliveアノテーションが必要です。

RichFaces 3.3 Bean の実装

@KeepAlive
public class Bean {
    public Bean() {
    }
    public void save() {
    }
}

JSF 2 / RichFaces 4.x Bean の実装

@ManagedBean
@ViewScoped
public class Bean {
    public Bean() {
    }
    public void save() {
    }
}
于 2012-06-15T02:31:22.120 に答える
0

これは、javascript を使用するとかなり簡単に行うことができます。(タブを設定したら) 行う必要があるのは、さまざまなタブ付きコンポーネントを表示および非表示にするロジックを追加することだけです。

于 2012-06-14T18:15:12.350 に答える