Jsf 在从数据库中删除单个元素后,它仍然在p:tree中呈现,直到我更改另一个元素或刷新页面为止
我无法通过ajax更新PrimefacesJsf 在从数据库中删除单个元素后,它仍然在p:tree中呈现,直到我更改另一个元素或刷新页面为止,jsf,primefaces,tree,Jsf,Primefaces,Tree,我无法通过ajax更新Primefacesp:tree中包含的元素列表。我面临的问题是:在从数据库中删除单个元素后,它仍然呈现在树中,直到我更改另一个元素(导致另一个p:tree组件的更新)或刷新页面 该过程涉及两个托管bean: 1-第一个负责用数据库中包含的实体填充树,以下是相关代码: @Named @RequestScoped public class CredentialProvider { @Inject private UserFacadeLocal userFac
p:tree
中包含的元素列表。我面临的问题是:在从数据库中删除单个元素后,它仍然呈现在树中,直到我更改另一个元素(导致另一个p:tree
组件的更新)或刷新页面
该过程涉及两个托管bean:
1-第一个负责用数据库中包含的实体填充树,以下是相关代码:
@Named
@RequestScoped
public class CredentialProvider {
@Inject
private UserFacadeLocal userFacade;
private TreeNode userCredentials;
@PostConstruct
public void init() {
/* Uses facade to populate TreeNode with entities */
}
public TreeNode getUserCredentials(){
return userCredentials;
}
/* Other getters and setters */
}
2-第二个负责更新/删除实体,代码如下:
@Named
@RequestScoped
public class CredentialManager {
@Inject
private UserFacadeLocal userFacade;
public void deleteCredential(String userId){
User user = userFacade.find(userId);
userFacade.remove(user);
}
/* Other entitie handling methods */
}
删除元素的操作由以下操作触发:
<p:commandButton value="Delete" update=":treeContainer" actionListener="#{credentialManager.deleteCredential(node.login)}"
首先构造CredentialProvider
,因为需要它才能让JSF找到要删除的项,以便为deleteCredential()
方法提供正确的ID
只需在更新后显式地重新初始化模型
@Named
@RequestScoped
public class CredentialManager {
@Inject
private UserFacadeLocal userFacade;
@Inject
private CredentialProvider credentialProvider;
public void deleteCredential(String userId){
User user = userFacade.find(userId);
userFacade.remove(user);
credentialProvider.init();
}
/* Other entitie handling methods */
}
您可能希望将CredentialProvider
的作用域更改为@ViewScoped
,以使其在回发过程中保持活动状态,这样即使同时数据库被其他请求操作,也可以确保回发过程中的完整性。额外的好处是,它可以避免对数据库进行不必要的查询