Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 在从数据库中删除单个元素后,它仍然在p:tree中呈现,直到我更改另一个元素或刷新页面为止_Jsf_Primefaces_Tree - Fatal编程技术网

Jsf 在从数据库中删除单个元素后,它仍然在p:tree中呈现,直到我更改另一个元素或刷新页面为止

Jsf 在从数据库中删除单个元素后,它仍然在p:tree中呈现,直到我更改另一个元素或刷新页面为止,jsf,primefaces,tree,Jsf,Primefaces,Tree,我无法通过ajax更新Primefacesp:tree中包含的元素列表。我面临的问题是:在从数据库中删除单个元素后,它仍然呈现在树中,直到我更改另一个元素(导致另一个p:tree组件的更新)或刷新页面 该过程涉及两个托管bean: 1-第一个负责用数据库中包含的实体填充树,以下是相关代码: @Named @RequestScoped public class CredentialProvider { @Inject private UserFacadeLocal userFac

我无法通过ajax更新Primefaces
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
,以使其在回发过程中保持活动状态,这样即使同时数据库被其他请求操作,也可以确保回发过程中的完整性。额外的好处是,它可以避免对数据库进行不必要的查询