Mur*_*zen 3 javascript jsf el primefaces
onclick我的属性commandButton里面有一些EL依赖的Javascript.更具体地说,这是一段代码:
<p:commandButton
onclick="javascript: if('#{userBean.user.friendList.size() gt 0}' == 'true') deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
Run Code Online (Sandbox Code Playgroud)
deleteFriendsConfirmDialog清除朋友列表并更新@form.朋友列表,commandButton和对话框都是这种形式.
所以我点击按钮,确认对话框出现(因为朋友列表的长度是gt 0),我确认并清空列表,视图更新.但是,当我Delete all friends?再次单击该按钮时,将再次出现确认对话框.由于列表的长度现在为0,因此我希望显示错误对话框.
我想,这是因为内部写的Javascript onclick没有更新(虽然按钮在表单中).
编辑:更改#{userBean.user.friendList.size() gt 0}为#{not empty userBean.user.friendList}既不起作用也不起作用.
怎么会?这有什么不对?
任何帮助赞赏.:)
确实.PrimeFaces(和标准JSF)不会on*在每个请求的基础上重新评估属性中的EL .它只发生在每个视图的基础上.然而,RichFaces在<a4j:xxx>组件中做到了这一点.
您需要以不同方式解决问题.我建议使用相反的visible属性<p:dialog>.
<h:form>
...
<p:commandButton value="Delete all friends?" update=":deleteDialogs" />
</h:form>
...
<h:panelGroup id="deleteDialogs">
<p:dialog id="deleteFriendsConfirmDialog" visible="#{facesContext.postback and not empty userBean.user.friendList}">
...
</p:dialog>
<p:dialog id="friendsAlreadyDeletedErrorDialog" visible="#{facesContext.postback and empty userBean.user.friendList}">
...
</p:dialog>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
另一种方法是RequestContext在bean的action方法中使用PrimeFaces' ,它允许你在bean的action方法中以编程方式执行JavaScript代码(虽然这与控制器有点过多地与视图,IMO结合).
<p:commandButton value="Delete all friends?" action="#{userBean.deleteAllFriends}" />
Run Code Online (Sandbox Code Playgroud)
同
RequestContext context = RequestContext.getCurrentInstance();
if (!user.getFriendList().isEmpty()) {
context.execute("deleteFriendsConfirmDialog.show()");
} else {
context.execute("friendsAlreadyDeletedErrorDialog.show()");
}
Run Code Online (Sandbox Code Playgroud)
与具体问题无关,您的原始问题onclick虽然在您的特定情况下无法解决,但却显示出一些不良做法.该javascript:pseudoprotocol是多余的.这已经是默认值了.去掉它.此外,测试== 'true'是多余的.去掉它.只需让EL打印true或false直接打印.以下是正确的语法(同样,这不能解决您的问题,只是为了您的信息)
<p:commandButton
onclick="if (#{not empty userBean.user.friendList}) deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
Run Code Online (Sandbox Code Playgroud)
如果您使用的是RichFaces,它会起作用<a4j:commandButton>.
<a4j:commandButton
oncomplete="if (#{not empty userBean.user.friendList}) deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
Run Code Online (Sandbox Code Playgroud)