5

JSFページに次のものがあります。

<h:commandLink action="#{manager.removeEntity(row.id)}" value="Remove">
    <f:ajax event="action" render=":form:table" />
</h:commandLink>

アクションが実行されるにコンポーネントをレンダリングしますが、レンダリングは完全に機能します。(私はロギングを通してこれを知っています)

サーバーでアクション機能が実行された後にコンポーネントをレンダリングする方法はありますか?

どんな助けでも大歓迎です

アップデート1

action属性を削除し、タグにリスナーを追加しましたが、残念ながら役に立たないようですが、コンポーネントツリーがレンダリングされた後もメソッドが呼び出されます。

4

3 に答える 3

1
<h:commandLink action="#{manager.removeEntity(row.id)}" value="Remove">
    <f:ajax event="action" render=":form:table" />
</h:commandLink>

アクションが実行される前にコンポーネントをレンダリングしますが、レンダリングは完全に機能します。(私はロギングを通してこれを知っています)

これは真実ではありません。ロギングを誤って解釈しているに違いありません。おそらく、レンダリング応答中にのみ呼び出されるという誤解で、テーブルの値のgetterメソッド内にlogステートメントを配置しました。したがって、これは真実ではありません。ゲッターは、プロパティを参照するEL式が評価されるたびに呼び出されます。これは、アクションフェーズの呼び出しの前後で異なるフェーズで発生する可能性があります。データテーブル内にコマンドリンクがあるため、リンクに関連付けられている行を見つけるために、リクエスト値の適用フェーズ中にテーブルの値ゲッターメソッドも呼び出されます。

FacesContext#getCurrentPhaseId()ログと一緒に渡して、どのフェーズでgetterメソッドが呼び出されるかを学習します。また、マネージドBeanゲッターメソッド内でビジネスジョブ(データベースの呼び出しなど)を実行することはお勧めできません。

参照:

于 2012-03-11T14:51:20.417 に答える
0

のを使用しlistenerf:ajaxロジックを実行しrow.id、次のいずれかの方法でを渡すことができます(を削除しますaction="#{manager.removeEntity(row.id)}"

ajax呼び出し1でパラメーターを渡す

ajax呼び出し1でパラメーターを渡す

于 2012-03-11T09:30:39.880 に答える
0

ちょっと遅れましたが、私は同じ問題を抱えていました。jsf ロジックが完了する前に ajax がレンダリングされます。私の解決策は?さて、確認ダイアログを追加しました。技術的な解決策ではないことはわかっていますが、うまくいきます。ユーザーがダイアログで [OK] を押すと (約 1 秒かかります。この間にロジックが実行されます)、コンポーネントがレンダリングされます。幸運を祈ります。

変更前:

<h:commandButton action="#{bean.buisnessLogic(param1, param2)}">
  <f:ajax
      execute="components"
      render="table"
  />
</h:commandButton>

変更後:

<h:commandButton onclick="javascriptCofirm();" action="#{bean.buisnessLogic(param1, param2)}">
  <f:ajax
      execute="components"
  />
</h:commandButton>
<h:commandButton id="button" style="display: none">
  <f:ajax
     render="table"
  />
</h:commandButton>

JavaScript:

function javascriptConfirm() {
   bootbox.alert("Se agrego la accion con exito.", function () {
      var boton = document.getElementById("button");
      boton.click();
   });
   e.preventdefault();
   return false;
}

私がしたこと:

わかりましたので、変更が行われる前に。私の commandButton は、レジスタが追加される前にテーブルをレンダリングします。たとえば、行 2 を追加すると、ページが更新されるか行 3 が追加されるまで変更が表示されません。私はいくつかの調査を行い、jsf は ajax タグを JavaScript に変換し、JavaScript はアクションが完了するのを待たずにコードを直接実行するという結論に達しました。

解決:

だから今、私はajaxからrender属性を削除し、別のcommandButtonを作成し、新しいcommandButtonにrenderを追加します。javascriptConfirm メソッドがボタンを呼び出して「クリック」します。これによりページがレンダリングされますが、ビジネス ロジックが完了していることを確認するまでには. そうそう。これはおそらく紛らわしいです。あなたがコメントしたものは何でも、私はできるだけ早く対応しようとします(おそらくそれほど速くはありません).

于 2016-03-14T21:47:31.250 に答える