PrimeFaces 5.0, JSF 2.2, Glassfish 4.1.1,
我假设我的设置中的某些内容未正确配置,但我不确定要查看什么...
所以我使用托管bean 来支持JSF 页面。在页面上的 PrimeFace 元素中,如果我使用 oncomplete 属性,则会在页面加载时调用它引用的方法。我不希望它在每个页面加载时调用该方法,而且我不认为应该这样做!
我已经通过几个页面和不同的元素对此进行了测试。
我第一次注意到这个问题是通过 <p:fileupload>
一旦所有文件上传完毕,我试图使用 oncomplete 调用一个方法。
我随后在 <p:commandbuttons>
上尝试过此操作并且在页面加载时调用 oncomplete。
我检查了生成的 HTML,有一个格式正确的 <head>
标签对。
我还完成了对生成的 HTML 存在和不存在 oncomplete 属性的比较。
与:
<button id="j_idt21:j_idt26"
name="j_idt21:j_idt26"
class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
onclick="PrimeFaces.ab({s:'j_idt21:j_idt26',onco:function(xhr,status,args){;}});
return false;"
type="submit">`
没有:
<button id="j_idt21:j_idt26"
name="j_idt21:j_idt26"
class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
onclick="PrimeFaces.ab({s:'j_idt21:j_idt26'});
return false;"
type="submit">
下面是上述 HTML 的代码,显示 oncomplete 会在加载任何页面时调用该页面上的方法。这是我的登录页面。
<p:commandButton validateClient="true" value="Login"
action="#{loginJSFManagedBean.validateCredentials}"
type="submit"
ajax="true"
oncomplete="#{loginJSFManagedBean.validateCredentials}">
</p:commandButton>
每次加载登录页面时,都会调用 validateCredentials 方法,甚至在页面完成渲染之前...
这是我的文件上传的 JSF 片段:
<h:form enctype="multipart/form-data">
<p:fileUpload oncomplete="#{JSFManagedBean.extract()}"
fileUploadListener="#{JSFManagedBean.handleTarFileUpload}"
mode="advanced" ></p:fileUpload>
</h:form>
每次页面加载时都会调用 extract() 方法...
最佳答案
oncomplete 是客户端 JavaScript 回调。当页面呈现时,您的方法就会被调用,因为服务器会计算那些 EL 表达式,期望它们生成包含要发送的 javascript 代码的字符串。
您可能根本不需要这些 oncomplete 处理程序。对于登录按钮,操作处理程序应该足够了。对于 fileUpload,如果您的目标只是像方法名称所暗示的那样“提取”上传的文件,那么 fileUploadListener 可能就足够了。
关于页面加载时调用 PrimeFaces oncomplete 支持方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805864/