【问题标题】:JSF Ajax called only 1st timeJSF Ajax 仅第一次调用
【发布时间】:2017-10-12 20:16:00
【问题描述】:

在 JSF2 中,我有一个这样的 XHTML:

<h:form id="myForm">
...
    <c:forEach items="#{myController.header}" var="hd" varStatus="count">
         #{hd}
         <h:selectOneMenu value="#{myController.type[count.index]}" id="formtype" >
                 <f:selectItem itemValue="Nop" itemLabel="Nop" />
                 <f:selectItem itemValue="Yep" itemLabel="Yep" />
                 <f:ajax render="@form" />
          </h:selectOneMenu>
          #{myController.type[count.index]}
          <h:selectBooleanCheckbox value="#myController.valid[count.index]}" id="valid">
                 <f:ajax render="@form"/>
          </h:selectBooleanCheckbox> 
          #{myController.valid[count.index]}
     </c:forEach>
...
</h:form>

我的托管 bean 有:

private String[] type;
private boolean[] valid;

我在第一次加载命名 bean 时初始化(type = new String[...]; 并为每个位置分配一个值)。

如果我修改组合或复选框,它可以工作,托管 bean 中的值会更改,并且新值会在 JSF 页面中打印(呈现)。但只有第一次。接下来的更改根本不会修改任何内容。这很奇怪,因为我在其他应用程序中有类似的代码并且工作正常,所以我做错了一些事情但找不到它。我的模板有一个h:header,我在 JS 控制台或 TomEE 中看不到任何日志(我只看到 .INFO - The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myApp]] after start() had already been called. The second call will be ignored,但我认为它不相关)。我曾尝试添加execute="@this"/execute="@form" 和其他未成功,并检查了this post 的所有要点,但似乎没有什么适用于我。

我没有看到什么错误?


编辑

@Named(value = "myController")
@ViewScoped
public class MyController implements Serializable {
...

我的模板中还有一个&lt;h:messages globalOnly="true" showDetail="true" showSummary="true" /&gt;

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    我想我终于明白了!

    多亏了两件事:

    1. BalusC answer 中的第 3 点。我在模板&lt;h:messages id="msg" 中为我的消息添加了一个id,然后使用&lt;f:ajax render="@form msg"....。这导致出现错误j_idt1: Validation Error: Value is required

    2. 然后我可以在this post 中找到解决方案:将所需参数从true 更改为&lt;f:viewParam required="#{!facesContext.postback}"。这在我的其他应用程序中不是必需的,因为 required 是“false”,因为它可以带参数或不带参数调用。当使用参数调用它时,它可以正常工作,因为在没有它的情况下可以调用页面。

    【讨论】:

    • 太好了,你找到了答案。您是否在“开发”模式下运行您的应用程序?通常,如果消息无法/不会显示,您会在日志中看到“警告”... 开发时在开发模式下运行总是很好
    • 我有一个&lt;context-param&gt;&lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;&lt;param-value&gt;Development&lt;/param-value&gt;&lt;/context-param&gt;,但在日志中看不到任何内容
    【解决方案2】:

    遇到了完全相同的问题,我的&lt;f:ajax&gt; 标签第一次可以工作,然后什么都没有……页面上没有错误或任何内容。经过几个小时和无数的谷歌搜索,什么都没有出现。 (StackOverflow 上的大多数问题实际上都存在相反的问题,Ajax 不会第一次触发,但它会正常工作)。我终于偶然发现了这个问题,它准确地描述了我所看到的。

    我之前试图只重新渲染页面的一部分,但我注意到一旦我将render 属性更改为"@all",我收到了与上述相同的错误消息:

    j_idt1: Validation Error: Value is required

    我向上滚动并注意到我有一个 &lt;f:viewParam&gt; 所需的设置为 "true"。我进行了 user1156544 描述的更改,并且成功了。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多