【问题标题】:Refreshing some content to make them disappear after clicking a delete button单击删除按钮后刷新某些内容以使其消失
【发布时间】:2014-01-02 13:45:27
【问题描述】:

我使用<rich:datatable> 来显示来自List<Map<String, String>> 的数据(实际上,该列表只有一个Map<String, String>)。 datatable 在一行中显示数据,并在行旁边显示一个编辑和删除按钮。

当我单击delete button 时,我会从List 和数据库中清除注册表。我想,当我单击delete button 时,不要显示来自datatable 的内容并禁用editdelete buttons。这是数据表代码:

 <rich:dataTable value="#{searchAuthDetailController.finalResults}" 
        id="table" var="result"> 
            <c:forEach items="#{searchAuthDetailController.variableNames}" var="vname">
                <rich:column>
                         <f:facet name="header">#{vname}</f:facet>
                          #{result[vname]}
                     </rich:column> 
            </c:forEach> 
            <rich:column>
            <h:commandButton action="EditAuthor"  value="Edit" 
            disabled="#{searchAuthDetailController.editBtDisabled}">
                        <f:setPropertyActionListener target="#{editAuthController.selectedAuthor}"  
                        value="#{searchAuthDetailController.selectedAuthor}"/> 
            </h:commandButton>
            </rich:column>
            <rich:column>
            <a4j:commandButton value="Delete" disabled="#{searchAuthDetailController.deleteBtDisabled}"
             action="#{searchAuthDetailController.removeSelectedAuthor()}" render="table"/>
            </rich:column>
       </rich:dataTable>  

还有一个List&lt;String&gt;datatable 下方显示一些链接。在我点击删除按钮后,我希望这些链接和上面的文字不再出现。

<h:outputText value="#{searchAuthDetailController.linksLabel}" />
      <br />
       <a4j:repeat value="#{searchAuthDetailController.sameasListToShow}" var="uri" >
            <a href="#{uri}">#{uri}</a>
             <br />
       </a4j:repeat>

我使用 2 个变量,称为 deleteBtDisablededitBtDisabled 作为按钮中 disabled property 的值。在 remove()(下面的代码)处,我将这些变量设置为 true,并清除 List&lt;Map&lt;String, String&gt;&gt;、变量名 ListList 显示的链接和 linkslabel。 这里是remove()

public void removeSelectedAuthor() {
        this.authMapper.remove(bdModel, this.selectedAuthor);
        this.variableNames.clear();
        this.editBtDisabled = true;
        this.deleteBtDisabled = true;
        this.sameasListToShow.clear();
        this.linksLabel = "";
    }

另外,delete buttonrender 属性设置为datatable's id。

使用所有这些代码,当我单击删除按钮时,只有数据表中的内容消失,但按钮继续启用,链接列表继续存在。

我该如何解决这个问题?

【问题讨论】:

    标签: java jsf refresh ajax4jsf


    【解决方案1】:

    我不是 Richfaces 用户。但是:

    1) JSF 标准 CommandButton 的 Action 方法应返回结果 Navigation String 或 Null(在您的情况下)。例如:公共字符串 removeItem() {...}

    2) 建议使用 List 作为数据表的值而不是地图,我不知道你的属性是什么类型finalResults

    3) 如果您使用 JSF 2.x,那么您可以将参数作为 EL ValueExpression 传递给您的 actionMethods:action="#{searchAuthDetailController.removeSelectedAuthor(item.id)}",我建议使用 &lt;f:ajax ....&gt; 进行更新,然后您可以只渲染/更新页面的某些部分

    我希望这些帮助。

    如果您希望我可以给您一个工作示例(没有richfaces)。

    更新:示例

    Bean:注意:无需在 faces-config 中注册您的 Bean,而是在这里使用 Annotations 来做到这一点

    import java.util.ArrayList;
    import java.util.List;
    
    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    
    @ManagedBean(name="bbean")
    @SessionScoped
    public class MyBean {
    
        private boolean dataTableRendered;
        private boolean linksRendered;
        private List<User> users;
        private List<String> links;
    
        public MyBean() {
    
        }
    
        @PostConstruct
        public void init(){
            try{
                users = new ArrayList<User>();
                links = new ArrayList<String>();
                dataTableRendered = new Boolean(true);
                linksRendered = new Boolean(true);
                for(int i=0; i<5; i++){
                    users.add(new User(i,"User: XYZ-"+i));
                }
    
                for(int i=0; i<3; i++){
                    links.add("http://www.abc-"+i+".tld");
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }   
    
        public final void removeUser(final User selectedUser){
            if( selectedUser == null ){
                return;
            }
            for(User u: this.users){
                if( u.getId() == selectedUser.getId() ){
                    users.remove(u);
                    break;
                }
            }
            this.setLinksRendered(false);       
        }   
    
        public boolean isDataTableRendered() {
            return dataTableRendered;
        }
        public void setDataTableRendered(boolean dataTableRendered) {
            this.dataTableRendered = dataTableRendered;
        }
        public boolean isLinksRendered() {
            return linksRendered;
        }
        public void setLinksRendered(boolean linksRendered) {
            this.linksRendered = linksRendered;
        }
        public List<User> getUsers() {
            return users;
        }
        public void setUsers(List<User> users) {
            this.users = users;
        }
        public List<String> getLinks() {
            return links;
        }
        public void setLinks(List<String> links) {
            this.links = links;
        }
    
    }
    

    用户对象:

    import java.io.Serializable;
    public class User implements Serializable{
        private static final long serialVersionUID = -8349963947101031989L;
        private int id;
        private String name;
        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    

    表单xhtml页面:

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          >
    <h:head>
        <meta charset="UTF-8" />
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title>Test</title>    
    </h:head>
    <body>
    <f:view> 
    <h:form id="dataForm">
    <h:dataTable id="dataTable" var="user" value="#{bbean.users}"
                rendered="#{bbean.dataTableRendered}"
                >
                <h:column>
                    <h:outputText value="#{user.name}"></h:outputText>              
                </h:column>
                <h:column>
                    <h:commandButton value="Remove">
                        <f:ajax execute="@form" render="@form" listener="#{bbean.removeUser(user)}" />
                    </h:commandButton>
                </h:column>
    </h:dataTable>
    <h:panelGroup layout="block" id="linksTable" rendered="#{bbean.linksRendered}">
    <ui:repeat var="link" value="#{bbean.links}">
    <h:outputText value="#{link}, "></h:outputText>
    </ui:repeat>
    </h:panelGroup>
    </h:form>
    </f:view>
    </body>
    </html>
    

    【讨论】:

    • 谢谢!你能给我一个 和数据表的例子吗(不需要是richfaces)。我不确定如何使用它..
    • 我更新了我的答案。我在 Tomcat 7.x 上使用 JSF 2.2、Mojarra 2.2 对其进行了测试
    • 谢谢你的例子!!这就是我正在使用的确切配置。查看 f:ajax 的执行和渲染属性。我使用标签的名称吗? - 因为 h:form 标签,你使用了@form 吗?
    • 不是标签的名称,而是来自 API Docs: Evaluates to Collection。将参与请求处理生命周期的“执行”部分的组件的标识符。如果指定了文字,则标识符必须用空格分隔。可以在标识符中指定任何关键字“@this”、“@form”、“@all”、“@none”。
    • 欢迎,很高兴我能提供帮助
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多