ユーザーが h:selectManyCheckbox から選択した値を変更するたびに、ブール変数の状態を更新しようとしています。DB から動的にロードする調査があります。質問には、多肢選択式と単一選択式の 2 種類があります。質問への回答の 1 つにブール値がある場合 (追加の回答が必要)、このオプションを選択すると、inputText が表示されます。単一選択の質問と SelectOneRadio に対してこのソリューションを作成することに成功し、思いどおりに機能します。
残念ながら、SelectManyCheckbox では機能しません。<f:ajax>
タグを入れる<f:selectItems ... >
とエラーがスローされます:
エラー:
javax.servlet.ServletException: <f:ajax> contains an unknown id 'podgladAnkietyForm:repeatLoop:2:selectBoxes' - cannot locate it in the context of the component selectBoxes
に何らかの問題があると思います<ui:repeat>
。selectManyBox で同様のコードを実行しようとすると、ui:repeat ループの外側で動作します。さらに、ほぼ同じコードで動作し<h:selectOneRadio>
ます!更新したいコンポーネントをバインドし、絶対パスを変更し render=":podgladAnkietyForm:repeatLoop:#{loop.index}:selectBoxes"
、NamingContainerを追加しようとしまし<f:subView>
たが、それも役に立ちませんでした。<f:ajax>
タグを削除すると動作します。結果コードは次のとおりです。
結果のhtmlコード
<input name="podgladAnkietyForm:repeatLoop:3:selectBoxes" id="podgladAnkietyForm:repeatLoop:3:selectBoxes:0" value="121" type="checkbox"><label for="podgladAnkietyForm:repeatLoop:3:selectBoxes:0" class=""> Answer content</label>
何が間違っていたのか、まったくわかりません。誰かが同様の問題を抱えていましたか?DB からすべての質問をロードするため、ui:repeat ループを削除できません。いくつかの回避策?
JSFページ
<h:form id="podgladAnkietyForm" prependId="true" >
<ui:repeat value="#{fillSurvey.surveyQuestions}" var="surveyQuestion" varStatus="loop" id="repeatLoop">
<br/>
<h:outputText value=" Pytanie #{loop.index + 1}" styleClass="naglowek" style="font-size: medium;" />
<h:outputText value=" * odpowiedź obowiązkowa " rendered="#{surveyQuestion.question.isMandatory}" style="color: red; font: small bold"/><br/>
<h:outputText value="#{surveyQuestion.question.content}" /> <br/>
<h:panelGroup rendered="#{surveyQuestion.question.isMultiplechoice}" id="multiplechoiceGroup" >
<h:selectManyCheckbox value="#{surveyQuestion.answers}" id="selectBoxes" layout="pageDirection" required="#{surveyQuestion.question.isMandatory}">
<f:selectItems value="#{surveyQuestion.optionsList}" var="entry" itemLabel="#{entry.content}" itemValue="#{entry.optionId}" id="multiplechoiceOption" />
<f:ajax />
<f:ajax event="click" execute="@this" listener="#{surveyQuestion.checkSelected}" render="selectBoxes" />
</h:selectManyCheckbox>
<h:inputText label="Pytanie #{loop.index + 1}" value="#{surveyQuestion.descriptionValue}" style="display: block;" rendered="#{surveyQuestion.haveDesc}" required="#{surveyQuestion.needDesc}" id="textField" />
</h:panelGroup>
<!-- This part of code works perfectly - SelectOneRadio - After selecting option that require additional description TextInput is showed -->
<h:panelGroup rendered="#{!surveyQuestion.question.isMultiplechoice}" id="selectOneGroup" >
<h:selectOneRadio value="#{surveyQuestion.selectedItem}" id="selectOneID" layout="pageDirection">
<f:selectItems value="#{surveyQuestion.optionsList}" var="entry" itemLabel="#{entry.content}" itemValue="#{entry.optionId}" id="OneSelectOption" />
<f:ajax event="click" execute="@this" render="selectOneGroup" listener="#{surveyQuestion.counter}" />
</h:selectOneRadio>
<h:inputText label="Pytanie #{loop.index + 1}" value="#{surveyQuestion.descriptionValue}" style="display: block;" rendered="#{surveyQuestion.haveDesc}" required="#{surveyQuestion.needDesc}" size="40"/>
<h:outputText value="#{surveyQuestion.testField}" />
</h:panelGroup>
</ui:repeat>
<br/><br/>
<h:commandButton action="#{fillSurvey.validateSurvey()}" value="Validate" /> <br/>
</h:form>
バッキングビーン
public class SurveyQuestion implements Serializable {
Question question;
List<Options> optionsList;
List<String> answers;
boolean haveDesc;
boolean needDesc;
int selectedItem;
String descriptionValue;
int testField;
///Getters and setters
public void counter(AjaxBehaviorEvent e){
for(Options opt: optionsList){
if ( selectedItem == opt.getOptionId()) {
if(opt.getHaveDesc() || opt.getDescReqr()){
this.haveDesc = true;
if (opt.getDescReqr()) {
this.needDesc = true;
} else {
this.needDesc = false;
}
} else {this.haveDesc = false; this.needDesc=false; }
}
}
testField++;
}
//its empty but it will look like the one above
public void checkSelected(AjaxBehaviorEvent e){
testField++;
}
}