0

次のシナリオを想定します。jsfコンポーネント(例:CommandButton)のレンダリング属性は、アプリケーションスコープの管理プロパティに依存します。プロパティはすべてのセッションで共有されるため、次のことが簡単に発生する可能性があります。ユーザーAがjsfページをロードし、ボタンのrender属性がtrueであるため、レンダリングされます。これで、ユーザーBもページをロードし、render属性は引き続きtrueになります。これで、ユーザーAがボタンをクリックすると、プロパティの値が変更され、ボタンはレンダリングされなくなります。ユーザーBはまだ古いビューを持っており、render属性は現在falseですが、その間にビューを更新しなかったため、ボタンをクリックできます。ユーザーBがボタンをクリックするとどうなりますか?

レンダリング属性はボタンのレンダリングに使用されるだけで、ページがレンダリングされると影響を与えなくなるため、ボタンのアクションはとにかく起動されると思いました。しかし、いくつかのテストを行った後、ボタンをクリックした後にレンダリング属性も再度チェックされ、属性がfalseの場合、アクションは実行されないように見えます。誰かがこれを確認できますか?

4

1 に答える 1

0

免責事項: 今のところ、奇妙なデザインは無視します。

しかし、いくつかのテストを行った後、ボタンをクリックした後にrender属性も再度チェックされ、属性がfalseの場合、アクションは実行されないようです。誰かがこれを確認できますか?

それは正解です。これは、実際にはサーバー側でレンダリングされないアクション コンポーネント (現在のユーザーが管理者ロール)。( renderedanddisabledおよびreadonly) 属性は、フォーム送信の処理中に常に再チェックされます。

特定のケースでは、同じビューと対話している限り、このコピーのみが使用されるように、ビュー スコープ内の属性を担当する条件のコピーが必要です。renderedこれは、アプリケーション スコープのプロパティをビュー スコープのマネージド Bean のマネージド プロパティとして注入し、rendered代わりにそれを属性で参照するだけで実現できます。

@ManagedBean
@ViewScoped
public class ViewBean {

    @ManagedProperty("#{appBean.rendered}")
    private boolean rendered;

    // ...
}

<h:commandButton ... rendered="#{viewBean.rendered}" />
于 2012-11-18T23:30:28.430 に答える