我有,我想顯示問題的嵌套列表。最初,我正在顯示1級問題,然後根據用戶對其父問題的回答顯示子問題。所有的問題都有一個單選按鈕和一些問題,當有用戶選擇「是」阿賈克斯監聽事件valueChange似乎被解僱的onClick代替的onChange
這是我與嵌套數據表JSF代碼所顯示的附加信息的輸入框。請注意,我已經退出了對這些問題的格式,以簡單地在論壇上的問題,所以這些看起來「unpretty」如果您將此代碼複製到自己的環境和運行代碼:
<h:dataTable id="questionTable" var="q" value="#{generalQuestionBean2.questions.questions}">
<h:column><h:panelGroup id="questionGrp">
#{q.question} <h:selectOneRadio value="#{q.answer}">
<f:selectItem itemValue="1" itemLabel="Yes"/>
<f:selectItem itemValue="0" itemLabel="No"/>
<f:ajax event="valueChange" execute="@form"
render="questionGrp"
listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio> <h:inputText value="#{q.addnInfo}"
rendered="#{q.answer eq '1' and q.field ne 'otherCov'}"></h:inputText>
<h:panelGroup id="questionGrpSubs" rendered="#{q.addnQuestions ne null and q.answer eq '1'}">
<h:dataTable id="subQuestionTable" var="subq" value="#{q.addnQuestions}">
<h:column><h:panelGroup id="subQuestionGrp">
->#{subq.question} <h:selectOneRadio id="answer" value="#{subq.answer}">
<f:selectItem itemValue="1" itemLabel="Yes"/>
<f:selectItem itemValue="0" itemLabel="No"/>
<f:ajax event="valueChange" execute="@form"
render="subQuestionGrp"
listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio><h:inputText value="#{subq.addnInfo}"
rendered="#{subq.answer eq '1' and subq.field ne 'voluntaryComp' and subq.field ne 'uslh'}"></h:inputText>
<h:panelGroup id="questionGrpSubs2" rendered="#{subq.addnQuestions ne null and subq.answer eq '1'}">
<h:dataTable id="sub2QuestionTable" var="sub2q" value="#{subq.addnQuestions}">
<h:column><h:panelGroup id="sub2QuestionGrp">
-->#{sub2q.question} <h:selectOneRadio id="answer" value="#{sub2q.answer}">
<f:selectItem itemValue="1" itemLabel="Yes"/>
<f:selectItem itemValue="0" itemLabel="No"/>
<f:ajax event="valueChange" execute="@form"
render="sub2QuestionGrp"
listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio><h:inputText value="#{sub2q.addnInfo}"
rendered="#{sub2q.answer eq '1'}"></h:inputText>
</h:panelGroup></h:column>
</h:dataTable></h:panelGroup>
</h:panelGroup></h:column>
</h:dataTable></h:panelGroup>
</h:panelGroup></h:column>
</h:dataTable>
這裏是支持bean復位功能的代碼:
private void reset(AjaxBehaviorEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
String id = event.getComponent().getClientId(context);
String[] tokens = id.split("[:]+");
int qId = -1;
int subqId = -1;
int sub2qId = -1;
for (int i = 0; i < tokens.length; i++) {
if(tokens[i].equals("questionTable"))
qId = Integer.parseInt(tokens[i+1]);
if(tokens[i].equals("subQuestionTable"))
subqId = Integer.parseInt(tokens[i+1]);
if(tokens[i].equals("sub2QuestionTable"))
sub2qId = Integer.parseInt(tokens[i+1]);
}
Question q = questions.getQuestion(qId);
Question processQ = q;
String defaultSubAnswer = getDefaultSubAnswer(q.getField());
Question subq;
Question subq2;
if(subqId > -1) {
subq = q.getAddnQuestions().get(subqId);
processQ = subq;
if(sub2qId > -1) {
subq2 = subq.getAddnQuestions().get(sub2qId);
processQ = subq2;
}
}
resetValue(processQ, defaultSubAnswer);
}
private void resetValue(Question q, String defaultSubAnswer) {
q.setAddnInfo("");
if(q.getAddnQuestions() != null) {
for (int i = 0; i < q.getAddnQuestions().size(); i++) {
Question subq = q.getAddnQuestions().get(i);
subq.setAnswer(defaultSubAnswer);
resetValue(subq, defaultSubAnswer);
}
}
}
現在的問題是:
阿賈克斯事件應該默認爲「valueChange」。如果我點擊「是」,然後再次點擊「是」,那麼ajax調用應該不會發生,對嗎?但它是,因爲附加信息框基於復位功能清除。
我最初嘗試給復位函數添加一個條件來檢查被點擊的按鈕的值,並且如果答案是「0」(否),只重置addnInfo值和子問題。但是這會導致渲染問題,因爲ajax調用會使輸入框和子問題隱藏起來,並且值將保留在前端,即使它們在後臺bean上重置。當他們重新渲染到前面時,保留的值顯示出來而不是後備bean中的值。
另一種嘗試是使用ValueChangeListener的值的復位。但是這仍然與重新渲染時保留的值有相同的問題。
我試圖3種不同的方法(上面列出),並都失敗了。我很樂意聽取任何這些或可能的解決方案的解決方案。請記住,用戶的格式限制使我用更少的選項來處理。
不幸的是,我們需要IE兼容,所以上述解決方案將無法正常工作。我確實在Firefox上試過它,並且效果很好,但對於IE(我們很多用戶正在使用)而言,這並不可取。 –
這將需要一些好的基於JavaScript的瀏覽器嗅探和黑客... – BalusC