不会更新目标组件,但 工作正常[重复]" /> <f:ajax render="someId"> 不会更新目标组件,但 <f:ajax render="@form"> 工作正常[重复]

不会更新目标组件,但 工作正常[重复]

2024-03-19

我在让 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) {}  

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

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

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


我假设之间的空间# and { in listener="# {option1.updateCheck}"只是提出问题时粗心的拼写错误。这个无效的 EL 语法确实“不起作用”。


您的具体问题归结为缺乏对基本 HTML/JavaScript 如何工作的理解(请记住,JSF 在这个问题的上下文中基本上只是一个 HTML/JS 代码生成器)。目前提供的代码存在2个技术问题:

  1. 您正在尝试使用 ajax 更新一个组件,该组件本身在 JSF 中有条件地呈现。这不起作用,原因很简单,JavaScript 无法通过以下方式找到非渲染 JSF 组件的 HTML 表示:document.getElementById()以便将其替换为从 ajax 响应获取的新 HTML 表示形式。

    您需要将其放在始终呈现的组件中。例如。这

    <ui:fragment id="photoDisabled" rendered="#{!option1.photometry}">
        <h:panelGrid columns="3">
    

    理论上需要替换为

    <ui:fragment id="photoDisabled">
        <h:panelGrid columns="3" rendered="#{!option1.photometry}">
    

  2. However, the <ui:fragment>不生成任何 HTML 标记(您可以通过查看 JSF 生成的 HTML 输出来确认这一点),因此 JavaScript 永远无法找到其 HTML 表示形式以更新其子级。您需要将其替换为 JSF 组件,该组件呈现具体的 HTML 元素,该元素可以通过通常的方式选择document.getElementById()方式,就像一个<h:panelGroup>它呈现一个 HTML<span>元素。

    总之,这应该做:

    <h:panelGroup id="photoDisabled">
        <h:panelGrid columns="3" rendered="#{!option1.photometry}">
    

也可以看看:

  • 当我想要 ajax 更新它时,为什么需要将 render="#{some}" 的组件嵌套在另一个组件中? https://stackoverflow.com/questions/9010734/why-do-i-need-to-nest-a-component-with-rendered-some-in-another-component-w/9010771#9010771
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不会更新目标组件,但 工作正常[重复] 的相关文章

随机推荐

  • 实施简单的文档管理

    我的问题是 根据以下要求 您将如何继续实施简单的DMS 文档管理 DMS应该是分布式Web应用程序 支持文档版本控制 支持文档锁定 文档搜索 我已经清楚我想使用什么技术 我将使用 Spring MVC Hibernate 和关系数据库 最有
  • 元素数组中的 jQuery min/max 属性

    有没有一种简单的方法可以从 jQuery 元素数组中查找 min max 属性 我经常发现自己根据最小和最大对应项动态调整元素组的大小 大多数时候 这与元素的宽度和 或高度有关 但我确信这可以应用于元素的任何属性 我通常会做这样的事情 va
  • 使用 EncodePointer/DecodePointer 的好处

    使用有什么好处编码指针 解码指针在 Windows 中 MSDN say 对全局可用的指针进行编码有助于保护它们不被利用 这编码指针函数用秘密来混淆指针值 以便外部代理无法预测它 使用的秘密编码指针每个进程都不同 现在的问题是 如果攻击者位
  • C++ 中的动态树

    我想制作一棵树 每个节点都可以有一些子节点 但我不知道它们的数量 树必须在小内存中使用 无额外数据 以每个节点的恒定时间进行编码 我认为我将创建具有值和子属性 值是 int 子属性是堆栈 的类 Tree 以及指向该树中每个节点的指针数组 我
  • Retrofit2:预期为 BEGIN_ARRAY,但在第 1 行第 268 列路径 $[0].images 处为 STRING

    我知道这不是第一次有人问这个问题 但使用 Retrofit2 我找不到正确的解决方案来解决我的问题 我有一个包含字符串列表的对象 当我想将 JSON 响应转换为我的对象时 所有其他字段都可以 但在将字符串列表转换为我的列表时出现此错误 Re
  • 在 React 中使用共享 Worker

    我有一个后端应用程序 它不断地通过 Web 套接字向我的 React 应用程序提供事件 当收到特定事件时 应打开一个新的浏览器选项卡 该应用程序将由用户在多个选项卡中运行 因此我只需打开一个新选项卡一次 并防止所有正在运行的实例打开它 我尝
  • 如何使用 PHP 在 OS X 10.5.8 中启用 Sqlite3?

    我想在我的 MAMP 堆栈上安装 Symfony 框架 然而 当我尝试运行它时 Symfony 抱怨我需要 安装并启用 SQLite3 或 PDO SQLite 扩展 我不知道该怎么做 我安装了sqlite3 sqlite3 version
  • 通过网络复制文件(需要身份验证)

    是否有某种方法可以验证本地 非网络 用户身份 以便通过网络在 Net 中复制文件 net use不是一个选择 我似乎无法得到登录用户 http blogs msdn com shawnfa archive 2005 03 21 400088
  • Enum RadioButtonFor 编辑器模板设置值

    基于this https stackoverflow com questions 18542060 mvc4 enum and radio button list问题 我实现了一个 RadioButtonFor 编辑器模板 我工作得很好 但
  • text 或 ntext 数据类型上 REPLACE 的替代方案

    我需要更新 替换 datatable column 中的数据 该表有一个名为Content 我正在使用REPLACE功能 由于列数据类型是NTEXT SQL Server不允许我使用REPLACE功能 我无法更改数据类型 因为该数据库是第三
  • (Scp - 权限被拒绝(公钥)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试使用linux命令Scp获取服务器 xx xx xxx xx 的文件并将其放到我的桌面上 这是我的语法 scp email pr
  • Kubernetes docker 示例不公开端口

    当我探索 kubernetes 时 我从文档建议的基于 docker 的入门指南开始 该指南可以在这里找到 https github com GoogleCloudPlatform kubernetes blob release 1 0 d
  • NuGet 包如何包含 app.config 和 web.config 的转换?

    我正在尝试创建一个 nuget 包 它将添加 DLL 并在正确的配置文件中对其进行配置 该包可以在控制台 表单应用程序或 Web 应用程序中使用 因此我想更新适当的配置文件 app config 或 web config nu spec 文
  • Power Bi:如何参数化 Top N 视觉级别过滤器 [重复]

    这个问题在这里已经有答案了 Since PowerBI不支持Top N过滤page level 我想要使用 N 作为参数针对多个视觉效果立即更改它 是否可以 P S In 提供了更复杂情况的解决方案 最后本文 https www sqlbi
  • 为 Guzzle CookieJar 设置 cookie

    我正在 PHP 中为需要身份验证的网站进行单元测试 身份验证是基于 cookie 的 因此我需要能够将这样的 cookie 放入 cookie jar 中 user token gt 2c26b46b68ffc68ff99b453c1d30
  • 在android中添加横向方向和代码的最简单方法

    我是新来的android并想知道如何添加landscape模式在android谁能告诉我最简单的方法 我正在寻找一种非常简单的方法 如果您有此类问题 请查看下面的答案 谢谢 I have a simplest way to add a la
  • 远程创建 Akka Actor,无需新的 ActorSystem

    我已经仔细阅读了文档好几次了 http doc akka io docs akka 2 1 4 scala remoting html http doc akka io docs akka 2 1 4 scala remoting html
  • 实体框架 4.0 GetChanges() 等效项

    在 LINQ to SQL 中 您可以重写 SubmitChanges 并使用 this GetChangeSet 方法来获取所有插入 更新和删除 以便您可以在将更改提交到数据库之前进行最后一刻的更改 这可以在 EF 4 0 中完成吗 我看
  • RethinkDB:​​RqlRuntimeError:无法对序列序列执行括号

    给定表格中的以下文档 id d30aa369 99d6 4a40 9547 2cbdf0bb069a locations alerts person 200 person 300 name home alerts person 200 pe
  • 不会更新目标组件,但 工作正常[重复]

    这个问题在这里已经有答案了 我在让 Ajax 正常工作时遇到问题 在我这里的 xhtml 文件中 我使用 Ajax 来呈现一些启用或禁用的输入 并且它工作正常 然而 更进一步 我还使用 Ajax 来渲染包含的 xhtml 文件 其中包含其他