2012-06-18 46 views
5

Tôi có h: datatable hiển thị danh sách các hàng và các trường của mỗi hàng là các trường nhập.JSF datatable: thêm và xóa các hàng xóa các giá trị hàng

Tôi hiển thị nút "Thêm hàng" trước bảng và nút "Xóa hàng" trên mỗi hàng của bảng.

Đậu nướng được xemScoped và các nút thêm/xóa phần tử từ danh sách java trong bean sao lưu, sau đó quay lại cùng một chế độ xem.

Tôi đặt thuộc tính ngay lập tức thành "true" trong các nút để không xác thực các trường nhập khi tôi thêm hoặc xóa hàng.

Mọi thứ đều hoạt động tốt nhưng có một điều: giá trị của các mục nhập được xóa sẽ bị xóa. Tôi nghĩ rằng quan điểm giữ các giá trị beacuse đậu là viewScoped.

Làm cách nào để có thể đạt được thêm/xóa hàng mà không kích hoạt xác thực và giữ các giá trị đã được người dùng nhập vào biểu mẫu?

Quan điểm của tôi:

<h:form> 
    <h:commandButton value="Añadir Fila" immediate="true" action="#{tablaController.addRowAction}" /> 
    <h:dataTable value="#{tablaController.lista}" var="fila" cellpadding="0" cellspacing="0" border="1"> 
     <f:facet name="header">TABLA</f:facet> 
     <h:column> 
      <f:facet name="header"><h:outputLabel value="NOMBRE" /></f:facet> 
      <h:inputText id="nom" value="#{fila.nombre}" /> 
      <h:message for="nom" class="msjError" /> 
     </h:column> 
     <h:column> 
      <f:facet name="header"></f:facet> 
      <h:commandButton value="Quitar Fila" immediate="true" action="#{tablaController.removeRowAction(fila)}" /> 
     </h:column> 
    </h:dataTable> 
</h:form> 

sự ủng hộ của tôi đậu:

@ManagedBean(name="tablaController") 
@ViewScoped 
public class TablaController { 

private List<Fila> lista; 
... 
public TablaController() { } 
... 
@PostConstruct 
public void init() { 
    this.lista = new ArrayList<Fila>(); 
    for (int i=0; i<5; i++) { 
     Fila fila = new Fila(); 
     fila.setNombre(""); 
     this.lista.add(i,fila); 
    } 
} 
... 
public String addRowAction() { 
    Fila fila = new Fila(); 
    fila.setNombre(""); 
    this.lista.add(fila); 
    return ""; 
} 

public String removeRowAction (Fila f) { 
    boolean exito = this.lista.remove(f); 
    return ""; 
} 
... 
} 

CẬP NHẬT -> GIẢI PHÁP CỦA TÔI:

tôi viết ở đây giải pháp của tôi nếu ai đó đang quan tâm.

Vấn đề là tôi sử dụng ngay = "true" để bỏ qua xác thực, nhưng điều này cũng làm cho việc bỏ qua update_model_values, do đó các giá trị do người dùng nhập vào biểu mẫu bị mất sau khi nhấp vào nút thêm/xóa và -redenring trang.

Khi tôi sử dụng "xác thực bean JSR-303", giải pháp của tôi là bỏ qua các xác thực bằng cách sử dụng f: validateBean để bật/tắt chúng. Tùy thuộc vào nút tôi nhấp vào, nếu tôi muốn xác thực thực thi, tôi bật xác thực bean (ví dụ như trong nút "gửi") và nếu tôi muốn bỏ qua chúng, tôi vô hiệu hóa xác thực bean (như trong phần thêm/xóa các nút hàng). Nhưng dù sao update_model_values ​​luôn luôn thực hiện, vì vậy các giá trị không bị mất.

Dưới đây là quan điểm:

<h:form> 
    <f:validateBean disabled="#{!empty param['disableValidation']}"> 
     <h:commandButton value="Añadir Fila" action="#{tablaController.addRowAction}"> 
      <f:param name="disableValidation" value="true" /> 
     </h:commandButton> 
     <h:dataTable value="#{tablaController.lista}" var="fila" cellpadding="0" cellspacing="0" border="1"> 
      <f:facet name="header">TABLA</f:facet> 
      <h:column> 
       <f:facet name="header"><h:outputLabel value="NOMBRE" /></f:facet> 
       <h:inputText id="nom" value="#{fila.nombre}" /> 
       <h:message for="nom" class="msjError" /> 
      </h:column> 
      <h:column> 
       <f:facet name="header"></f:facet> 
       <h:commandButton value="Quitar Fila" action="#{tablaController.removeRowAction(fila)}"> 
        <f:param name="disableValidation" value="true" /> 
       </h:commandButton> 
      </h:column> 
     </h:dataTable> 
     <h:commandButton value="Submit" action="#{tablaController.saveData}" /> 
    </f:validateBean> 
</h:form> 

Các ủng hộ đậu:

@ManagedBean(name="tablaController") 
@ViewScoped 
public class TablaController { 

private List<Fila> lista; 
... 
public TablaController() { } 
... 
@PostConstruct 
public void init() { 
    this.lista = new ArrayList<Fila>(); 
    for (int i=0; i<5; i++) { 
     Fila fila = new Fila(); 
     fila.setNombre("fila "+i); 
     this.lista.add(i,fila); 
    } 
} 
... 
public String addRowAction() { 
    Fila fila = new Fila(); 
    fila.setNombre(""); 
    this.lista.add(fila); 
    return ""; 
} 

public String removeRowAction (Fila f) { 
    this.lista.remove(f); 
    return ""; 
} 
... 
public String saveData() { 
    ... 
    //processes the valid data 
    //for example, calls to a service method to store them in a database 
    ... 
    return ""; 
} 
... 
} 
+0

hi i có cùng một vấn đề, giải pháp tốt. nhưng bạn có ý tưởng cách vô hiệu trình xác thực tích hợp, như "required = true" không? – wutzebaer

+2

Bạn có thể đặt yêu cầu = "# {empty param ['disableValidation']}". Bằng cách này, trường sẽ được yêu cầu hoặc không phụ thuộc vào nút bạn nhấp vào. Bạn chuyển thông số "disableValidation" nếu bạn muốn vô hiệu hóa thuộc tính bắt buộc. – choquero70

+2

@ choquero70 Bạn nên đăng câu trả lời của mình một cách riêng biệt. Đừng chỉ thêm nó vào câu hỏi. Bằng cách đó, người dùng SO sẽ dễ dàng phân tích và hiểu nó hơn. –

Trả lời

0

Tôi có chính xác cùng một vấn đề. Tóm lại, bạn KHÔNG thể sử dụng ngay lập tức cho hành động cập nhật bảng dữ liệu (UIData) hoặc lặp lại facelet. Giải thích ngắn gọn: các giá trị đã gửi không được giữ lại để hiển thị lại nếu đầu vào trong UIData không được xác thực. Dài giải thích có thể được tìm thấy ở đây: long explanationa related bug in Mojarra

2

Tôi đặt thuộc tính ngay lập tức để "true" trong các nút để không xác nhận các lĩnh vực đầu vào khi tôi thêm hoặc loại bỏ một hàng.

immediate="true" là công cụ sai cho công việc. Nó nên được sử dụng để ưu tiên xác thực, không được bật/tắt xác thực.Sự khác biệt là khá lớn khi bạn gặp phải chính mình.

Bạn muốn kích hoạt xác thực có điều kiện. Trong trường hợp ví dụ: required="true" mà muốn được dễ dàng như

<h:inputText ... required="#{saveButtonPressed}" /> 

nơi #{saveButtonPressed} đánh giá true khi nút tiết kiệm được nhấn. Ví dụ. khi ID khách hàng của nó xuất hiện trong bản đồ tham số yêu cầu.

Trong trường hợp của JSR 303 xác đậu, đó sẽ là một vấn đề của

<f:validateBean disabled="#{not saveButtonPressed}"> 
    <h:inputText ... /> 
</f:validateBean> 

hoặc với OmniFaces <o:validateBean> đó cho phép kiểm soát mà trên một cơ sở cho mỗi lệnh.

<h:commandButton id="add" ...> 
    <o:validateBean disabled="true" /> 
</h:commandButton> 
Các vấn đề liên quan