2015-03-17 2 views
1

Необходимые функции: У меня есть данные с 4 столбцами (уже хорошо работает, с целью пояснения я предоставил только один столбец «Цена»), а в последнем столбце у меня есть значок «изменить». Когда я нажимаю на иконку «Изменить», я бы хотел, чтобы inputText всплывал, где я могу делать свои модификации для каждого столбца в строке. С технической точки зрения я это делаю:Редактирование h: dataTable

В JSF:

<h:dataTable value="#{item.getItemList()}" var="c" 
    styleClass="order-table" 
    headerClass="order-table-header" 
    rowClasses="order-table-odd-row,order-table-even-row"> 
    <h:column> 
     <f:facet name="header"> Price </f:facet> 
     <h:inputText value="#{c.price}" size="5" rendered="#{c.editable}" /> 
     <h:outputText value="#{c.price}" rendered="#{not c.editable}" /> 
    </h:column> 
    <h:column> 
     <f:facet name="header"> Operation </f:facet> 
     <h:form> 
      <h:commandLink action="#{item.editAction(c)}"> 
       <h:graphicImage library="images" 
           name="modifyIcon.png" 
           width="20" 
           rendered="#{not c.editable}"/> 
      </h:commandLink> 
     </h:form> 
     <h:form> 
      <h:commandLink action="#{item.removeItem(c)}"> 
       <h:graphicImage value="resources/images/deleteIcon.png" width="20" /> 
      </h:commandLink> 
     </h:form> 
    </h:column> 
</h:dataTable> 

В боба:

public String editAction(Item item) { 
    item.setEditable(true); 
    return null; 
} 

и в п классе:

public boolean isEditable() { 
    return this.editable; 
} 

public void setEditable(boolean editable) { 
    this.editable = editable; 
}  

Тогда, когда я нажимаю на changeIcon.png ничего не происходит. Я бы ожидал появления полей ввода из других столбцов, но они этого не делают. Вы не знаете, где я мог сделать ошибку?

+0

может быть, это что-то делать с областями? Боб и класс модели @ApplicationScoped. –

+0

Почему вы используете отдельный '' для каждого отдельного ''? – Tiny

+0

Область применения, безусловно, является неправильной для этой цели, но не причиной этой конкретной проблемы. Чтобы исключить один и тот же метод, фактически вызывается метод editAction() 'или нет? Если нет, когда/где именно вы загружаете данные для свойства за 'getItemList()'? Имена переменных в вашем коде, кстати, непротиворечивы и, следовательно, запутывают. Название «item» ссылается на две совершенно разные вещи в вашем коде. – BalusC

ответ

0

Поскольку вы не показываете нам, где и как вы загружаете список предметов, мы не можем дать вам один абсолютный ответ. но вот рабочий пример:

import java.io.Serializable;  
public class TestItem implements Serializable{ 
    private static final long serialVersionUID = -2725423502616632442L; 
    private int id; 
    private double price; 
    private boolean editable;  
    public TestItem(int id, double price, boolean editable) { 
     super(); 
     this.id = id; 
     this.price = price; 
     this.editable = editable; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public double getPrice() { 
     return price; 
    } 
    public void setPrice(double price) { 
     this.price = price; 
    } 
    public boolean isEditable() { 
     return editable; 
    } 
    public void setEditable(boolean editable) { 
     this.editable = editable; 
    } 
} 

Контроллер:

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
@ManagedBean(name="testBean") 
@SessionScoped 
public class Test implements Serializable{ 
    private static final long serialVersionUID = 2010307013874058143L; 
    private List<TestItem> items; 
    public Test(){ 

    } 
    @PostConstruct 
    public void init(){ 
     items = new ArrayList<TestItem>(); 
     items.add(new TestItem(0,20.99,false)); 
     items.add(new TestItem(1,30.90,false)); 
     items.add(new TestItem(2,23.00,false)); 
     items.add(new TestItem(3,15.50,false)); 
    } 
    public final String setEditable(TestItem selectedItem){  
     selectedItem.setEditable(true); 
     return null;// null or your view-id 
    } 
    public final String save(){  
     for(TestItem i: this.getItems()){ 
      System.out.println(i.getPrice()); 
      i.setEditable(false); 
     } 
     return null;// null or your view-id 
    } 
    public List<TestItem> getItems() { 
     return items; 
    } 
    public void setItems(List<TestItem> items) { 
     this.items = items; 
    } 
} 

XHTML:

<h:form> 
    <h:dataTable id="DATA-TABLE" var="c" value="#{testBean.items}"> 
     <h:column> 
      <f:facet name="header"> Name </f:facet> 
      <h:inputText value="#{c.price}" size="5" rendered="#{c.editable}" /> 
      <h:outputText value="#{c.price}" rendered="#{not c.editable}" /> 
     </h:column> 
     <h:column> 
      <f:facet name="header"> Operation </f:facet> 
      <h:commandButton action="#{testBean.setEditable(c)}" value="EDIT" 
       rendered="#{not c.editable}"> 
      </h:commandButton> 
      <h:commandButton action="#{testBean.save}" value="SAVE" 
       rendered="#{c.editable}"> 
      </h:commandButton> 
     </h:column> 
    </h:dataTable> 
</h:form> 
+0

'prependId =" false "'? – Tiny

+0

@ Tiny, я проверил его код и пробовал много вещей с и без ajax, ... и т. Д. играл с requestScoped Bean и так далее, поэтому, пока я тестировал, я добавил prependId = «false», ... и т. д., но в этом примере не было необходимости. благодаря! –

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