1

ユーザーがいくつかのフィールドに入力する複雑なフォームがあり、ライセンス ファイルを生成するか、変更を保存するという 2 つのオプションがあります。ユーザーが変更を保存せずにライセンス ファイルの生成ボタンをクリックすると、小さなコンポーネントがレンダリングされ、ライセンスを生成する前に保存するよう求めるエラー メッセージが表示されます。警告メッセージ付きのコンポーネントを表示するには、ajax を使用して、警告コンポーネントをレンダリングするためだけにページ全体をレンダリングしないようにします。もちろん、変更が保存されていれば、警告メッセージは不要で、ユーザーを別のページにリダイレクトします。変更が行われたことを検出するために、変更可能なフィールドに変更リスナーがあります。私が知らないのは、条件付き実行です。「保存されていない場合はajaxでレンダリング、保存されている場合はリダイレクト」の部分。これがロジックです

if(saved){
  redirect();
}else{
  ajax.renderWarning()
}

--編集-- あまりにもオープンなままにしていることがわかったので、さらに情報を追加します。更新可能なフィールドの例を次に示します。

<h:inputText name="computername3"  value="#{agreement.licenseServerBeans[2].computerId}" valueChangeListener="#{agreement.fieldChange}">
    <rich:placeholder value="Add Computer ID"/>
</h:inputText>

fieldChange() Bean メソッド

public void fieldChange(ValueChangeEvent event) {   
   change = true; //change is a boolean, obviously :P
}

ライセンス生成ボタン jsf は次のとおりです。

<h:commandLink action="#{agreement.generateLicenseFile}">
    <span class="pnx-btn-txt">
        <h:outputText value="Generate License File" escape="false" />
    </span>
</h:commandLink>

これが generateLicenseFile() メソッドです

public String generateLicenseFile(){
    ....//lots of logic stuff
    return "/licenseGenerated.xhtml?faces-redirect=true";
}
4

1 に答える 1

3

PartialViewContext#getRenderIds()現在の ajax リクエストで更新する必要があるクライアント ID の変更可能なコレクションを取得するために使用します (これは で指定したものとまったく同じですが、プレフィックス<f:ajax render>のない絶対クライアント ID の形式になります)::

if (saved) {
    return "/licenseGenerated.xhtml?faces-redirect=true";
}
else {
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("formId:messageId");
    return null;
}

戻るnullと、同じビューが再表示されます。<h:messages>それをグローバルな顔メッセージとして追加して、レンダリングでajax コマンドが参照できるようにすることもできます。

if (saved) {
    return "/licenseGenerated.xhtml?faces-redirect=true";
}
else {
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(...));
    return null;
}

<h:messages id="messages" globalOnly="true" />
...
<f:ajax render="messages" />
于 2013-09-05T15:31:28.587 に答える