0

Tomcat 7.0.22.0 で Primefaces 3.3.1 を使用しています。p:inputText を含む p:dataTable があります。その p:dataTable の ID は「houseTabID:tabView:form0:table」です。HTMLソースからのコピペです。そして、p:dataTable のボタンでダイアログ (dataTable が存在するフォームの外側にあります) を開き、そのダイアログの p:commandButton で dataTable を更新します。

p:commandButton は次のようになります。

<p:commandButton ajax="true" action="#{myBean.setInputText()}"
    value="OK"
    update="#{myBean.getUpdateTarget(0)}"/>

myBean.getUpdateTarget(0) は、ターゲット コンポーネントを指す適切な文字列を再実行します。

「houseTabID:tabView:form0:table」を指定することで、dataTable 全体を正常に更新できます (myBean.getUpdateTarget(0) がその文字列を返すことを意味します)。しかし、テーブルに多くの行があるため、テーブル全体の更新が完了するまでに時間がかかり、スクロール位置がリセットされて本当にイライラします。そのため、テーブル全体ではなく、1 行だけを更新したいと思います。

そこで、まず「houseTabID:tabView:form0:table:inputBox」を返して、更新したいp:inputTextを更新しました。p:dataTable には、次のようなものがあります。

<p:column headerText="Value"
    width="300" style="height:16px; font-size:9pt;">
    <p:inputText id="inputBox" value="#{myItem.value}"
        style="width:95%; height:11px; font-size:9pt;">
        <f:ajax execute="@this" event="blur" />
    </p:inputText>
</p:column>

結果: 更新なし、エラー ログなし。「houseTabID:tabView:form0:table:inputBox」は、テーブルの行を指定していないため、機能しないことがわかっています。そこでrowIndexVarを使って、rowIndexVarから:0:部分を作って「houseTabID:tabView:form0:table:0:inputBox」でやってみました。文字列は HTML ソースからコピーして貼り付けます。しかし、残念ながら、私は例外を得ました。

javax.faces.FacesException: Cannot find component with identifier ":houseTabID:tabView:form0:table:0:inputBox" referenced from "houseTabID:j_idt181:j_idt186".

なんで?明らかに「houseTabID:tabView:form0:table:0:inputBox」があり、HTML ソースで確認できます。「houseTabID:tabView:form0:table」でタルベ全体を更新できますが、「houseTabID:tabView:form0」で例外をスローします。 :table:0:inputBox"? 私には意味がありません。また、「houseTabID:tabView:form0:table:inputBox」で例外をスローしたり、エラーログを流出させたりしないのはなぜですか? その p:commandButton; の HTML ソースを確認しました。

onclick="PrimeFaces.ab({source:'houseTabID:j_idt190:j_idt195',update:'houseTabID:tabView:form0:table:inputBox',

p:dataTable全体ではなく、1行だけを更新したいのです。私を助けてください。

4

2 に答える 2

1

解決策を見つけました。この会話によると、

position = JQuery(".ui-datatable-scrollable-body").scrollTop();
JQuery(".ui-datatable-scrollable-body").scrollTop(position);

トリックを行うことができます。これが p:dataTable の垂直スクロール位置を取得および設定する唯一の方法のようです。ダイアログを開く前に位置を保存し、ダイアログから p:dataTable を更新した後に位置を設定しました。それはうまくいき、これが私がやりたかったことです。

しかし、上記の方法には重大な問題があります。そのコードは、指定されたクラス「.ui-datatable-scrollable-body」を上からスキャンし、最初に見つかったクラスで実行します。したがって、1 つの p:dataTable に対してのみ機能します。幸いなことに、2番目の解決策を思い付くことができました。

<script type="text/javascript">
    $ = jQuery;
    var scrollPos;
        function saveScrollPos()
        {
            scrollPos = $("#houseTabID\\:tabView\\:form0\\:table_data").parents(".ui-datatable-scrollable-body").scrollTop();
        }
        function getScrollPos()
        {
            $("#houseTabID\\:tabView\\:form0\\:table_data").parents(".ui-datatable-scrollable-body").scrollTop(scrollPos);
        }
</script>

FireFox の FireBug は、「_data」が Primefaces によって追加されたコンポーネント ID を見つけるのに役立ちました。私の質問をご覧ください。私のデータ テーブルの ID は「table」で、誰かが「table_data」を作成しました。そして、上記のエスケープされた構文でそれを指すことができ、関数parent()がその場所につながります。私のアプリケーションでは問題なく動作しています。

私がネット上で見つけた唯一の解決策を投稿してくれたstier01に本当に感謝しています。そして、Primefaces p:dataTable がそのような基本的なことをサポートしていないことは本当に残念です。私たちの多くは、更新時に p:dataTable のスクロール位置を維持したいと考えていました。近いうちに改善されることを願っています。

于 2012-08-15T00:23:02.010 に答える
0

私はここで知っていることの端でぐらついていますが、ページ構築のタイミングが原因で起こっているのではないかと思います. DOM ツリーが構築されるとき、テーブルの行はまだ存在しないため、テーブルの外側にあるボタンは行への参照を見つけることができません (まだ存在しないため)。ツリーが構築され、データが入力されると、行が表示されます。そのため、ページがレンダリングされた後、列 ID を検索できますが、テーブルの外部から参照することはできません。

解決策がわかりません。おそらく、データテーブルタグにリモートコマンドを入れて更新することができます。たぶん、JSで何かをすることができます。

于 2012-07-27T13:17:55.577 に答える