2013-12-14 7 views
0

Я использую <rich:datatable> для отображения данных из List<Map<String, String>> (фактически, этот список содержит только один Map<String, String>). отображает данные в строке и показывает кнопку редактирования и удаления рядом со строкой.Обновление содержимого, чтобы они исчезли после нажатия кнопки удаления

Когда я нажимаю delete button, я очищаю регистр от List и из базы данных. Я хотел бы, когда я нажимаю delete button, чтобы не отображать содержимое с datatable и отключить edit и . Вот DataTable код:

<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<String> отображения некоторых ссылок ниже datatable. Я бы хотел, чтобы эти ссылки и текст выше не появлялись, после нажатия кнопки удаления.

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

Я использую 2 переменные, называемые deleteBtDisabled и editBtDisabled в качестве значения из disabled property с помощью кнопок. В remove() (код ниже) я установил эти переменные в true, и я очистил List<Map<String, String>>, переменные имена List, List отображаемых ссылок и 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 button имеет render свойство набора в datatable's ид.

Со всеми этими кодами, когда я нажимаю кнопку «Удалить», только содержимое из данных исчезает, но кнопки продолжают работать, а список ссылок продолжается.

Как я могу решить эту проблему?

ответ

1

Я не пользователь Richfaces. Но:

1) Метод действия стандарта JSF CommandButton должен возвращать результат. Строка навигации или Null (в вашем случае). напр .: общественного Строка RemoveItem() {...}

2) его рекомендуется использовать список в качестве значения DataTables, а не карты, я не знаю, какой тип имеет свою собственность finalResults

3), если вы используете JSF 2.x, то вы можете передавать параметры actionMethods как EL ValueExpression: action="#{searchAuthDetailController.removeSelectedAuthor(item.id)}", я рекомендую использовать <f:ajax ....> для обновления, то вы можете сделать/обновить только некоторые части страницы

я надеюсь, что это поможет.

, если хотите, я могу дать вам рабочий пример (без богатых поверхностей).

UPDATE: Пример

Bean: ПРИМЕЧАНИЕ: нет необходимости зарегистрировать Bean в гранях-конфигурации, а я использую здесь аннотаций, чтобы сделать это

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> 
+0

Спасибо! Не могли бы вы привести мне пример с и с данными (не обязательно быть богатыми). Я не уверен, как его использовать. – Luciane

+0

Я обновил свой ответ. Я тестировал его с помощью JSF 2.2, Mojarra 2.2 на Tomcat 7.x –

+0

Спасибо за пример! Это точная конфигурация, которую я использую. Посмотрите, для выполнения и рендеринга свойств f: ajax. Я использую имя тегов? - Вы использовали @form из-за тега h: form? – Luciane

 Смежные вопросы

  • Нет связанных вопросов^_^