does not update target component, 但 工作正常-6ren"> does not update target component, 但 工作正常- 这个问题在这里已经有了答案: Ajax update/render does not work on a component which has rendered attribute (1 个回答)-6ren">
gpt4 book ai didi

ajax - does not update target component, 但 工作正常

转载 作者:行者123 更新时间:2023-12-05 00:52:11 26 4
gpt4 key购买 nike

<分区>

我在让 Ajax 正常工作时遇到了问题。在我这里的 xhtml 文件中,我使用 Ajax 呈现一些启用或禁用的输入,并且它工作正常。然而,更进一步,我还使用 Ajax 呈现一个包含的 xhtml 文件,该文件包含其他控件,并标记为 id="photoEnabled"。当复选框未被选中时,一个由 id="photoDisabled"标记的虚拟显示将显示在它的位置,只是为了页面上的整洁演示,并且被禁用。

出于某种原因,这不起作用,我不明白为什么。但是,如果我替换:

<h:selectBooleanCheckbox id="photometry" value="#{option1.photometry}">   
<f:ajax event="click" render="photoEnabled photoDisabled" listener="# {option1.updateCheck}"/>
</h:selectBooleanCheckbox>

<!-- by -->

<h:selectBooleanCheckbox id="photometry" value="#{option1.photometry}">
<f:ajax event="click" render="@form" listener="#{option1.updateCheck}"/>
</h:selectBooleanCheckbox>

它确实可以正常工作,但问题是在页面的更上方并且未在此处显示,我还有一些其他输入字段,并且当复选框的状态更改时,字段被清除,因为整个表单已呈现,我不想要。

相关的 xhtml 代码在这里,显示了两个 Ajax 标记,一个有效,另一个无效。

 <p:fieldset id="chooseOutput" legend="and choose your output:" style="text-align:left">   
<h:commandButton id="popupChooseOutput" type="button" value="?" onclick="openPopup(420,370,'popups/helpOpt12')"
styleClass="queryButton"/>
<p:panelGrid id="specphot" styleClass="textCentered" style="margin-left:auto; margin-right:auto">
<p:row>
<p:column colspan="2">
<span></span>
</p:column>
<p:column>
<h:outputText value="λ<sub>1</sub>(Å)" escape="false"/>
</p:column>
<p:column>
<p:spacer width="2" height="0"/>
</p:column>
<p:column>
<h:outputText value="λ<sub>2</sub>(Å)" escape="false"/>
</p:column>
<p:column>
<p:spacer width="2" height="0"/>
</p:column>
<p:column>
<h:outputText value="Δλ(Å)" escape="false"/>
</p:column>
<p:column>
<p:spacer width="2" height="0"/>
</p:column>
<p:column>
<h:outputText value="R"/>
</p:column>
<p:column>
<p:spacer width="2" height="0"/>
</p:column>
<p:column>
<h:outputText value="<i>v</i>sin <i>i</i> (km/s)" escape="false"/>
</p:column>
</p:row>
<p:row>
<p:column>
<h:selectBooleanCheckbox id="spectrum" value="#{option1.spectrum}">
<f:ajax event="click" render="deltaLambda lambda1 lambda2 R vsini" listener="#{option1.updateCheck}"/><!-- This works -->
</h:selectBooleanCheckbox>
</p:column>
<p:column style="text-align:left">
<h:outputText value="Spectrum:" escape="false"/>
</p:column>
<p:column>
<h:inputText size="6" id="lambda1" value="#{simulator.lam1}" disabled="#{!option1.spectrum}"
styleClass="#{option1.enableStyle}"/>
</p:column>
<p:column>
<div></div>
</p:column>
<p:column>
<h:inputText size="6" id="lambda2" value="#{simulator.lam2}" disabled="#{!option1.spectrum}"
styleClass="#{option1.enableStyle}"/>
</p:column>
<p:column>
<div></div>
</p:column>
<p:column>
<h:inputText size="6" id="deltaLambda" value="#{simulator.dlam}" disabled="#{!option1.spectrum}"
styleClass="#{option1.enableStyle}"/>
</p:column>
<p:column>
<div></div>
</p:column>
<p:column>
<h:inputText size="6" id="R" value="#{simulator.lamByDlam}" disabled="#{!option1.spectrum}"
styleClass="#{option1.enableStyle}"/>
</p:column>
<p:column>
<div></div>
</p:column>
<p:column>
<h:inputText size="6" id="vsini" value="#{option1.vsini}" disabled="#{!option1.spectrum}"
styleClass="#{option1.enableStyle}"/>
</p:column>
</p:row>
<p:row>
<p:column>
<h:selectBooleanCheckbox id="photometry" value="#{option1.photometry}">
<f:ajax event="click" render="photoEnabled photoDisabled" listener="#{option1.updateCheck}"/><!-- This does not work -->
</h:selectBooleanCheckbox>
</p:column>
<p:column style="text-align:left">
<h:outputText value="Photometry:"/>
</p:column>
<p:column colspan="9">

<!-- Conditionally enable filter menu here and in Option 2. ""hiddenPhoto" is used by
JavaScript to test if any user defined filter files have been selected if it is "1".
If it is, it then tests if any files have been uploaded, in which case the user is
then given the choice of canceling the operation or deleting the uploaded files. -->

<h:outputText id="hiddenPhoto" class="hide" value="#{filters.displayUserDefined}"/>

<ui:fragment id="photoEnabled" rendered="#{option1.photometry}">
<ui:include src="include/filterMenu.xhtml"/>
</ui:fragment>

<!-- When the filter menu is disabled display the disabled menu in its place with the background color -->

<ui:fragment id="photoDisabled" rendered="#{!option1.photometry}">
<h:panelGrid columns="3">
<h:selectOneMenu value="#{filters.filterSet}" styleClass="filterMenuDisabled" disabled="true">
<f:selectItems value="#{filters.filtersMap}"/>
</h:selectOneMenu>
<h:selectOneRadio value="#{filters.radioValue}" disabled="true">
<f:selectItem itemValue="" itemLabel="AB"/>
<f:selectItem itemValue="" itemLabel="Vega"/>
</h:selectOneRadio>
</h:panelGrid>
</ui:fragment>

</p:column>
</p:row>
</p:panelGrid>
</p:fieldset>

在我的 Java 类中,我有各种 getter 和 setter,它们都可以正常工作,包括那些与复选框相关联的方法,以及除了似乎需要之外什么都不做的虚拟 Ajax 方法。

部分代码在这里:

public boolean isSpectrum() {   
return spectrum;
}

public void setSpectrum(boolean spectrum) {
this.spectrum = spectrum;
}

public boolean isPhotometry() {
return photometry;
}

public void setPhotometry(boolean photometry) {
this.photometry = photometry;
}

public void updateCheck(AjaxBehaviorEvent event) {}

我在 list 前面的一些复选框中遇到了类似的问题,为了使它们起作用,我必须使用“@form”而不是特定的 ID,因此当单击复选框时输入字段再次被清除。

有人可以帮助我解决我不明白的奇怪情况吗?是否应该在我的 bean 的 updateCheck() 方法中放置一些代码?

非常感谢,我期待着有趣的回复。

26 4 0