2012-06-22 13 views
5

Tôi có một Trang hiển thị chi tiết của một số Khách hàng. Tôi đang sử dụng t:loop để hiển thị một số dữ liệu. Trong t:loop Tôi chỉ đang đi qua sourcevalue. Cho đến nay rất tốt, trang của tôi đang hoạt động tốt. Nhưng khi tôi cố gắng gửi trang nó đột nhiên cho tôi Ngoại lệ.Bộ mã hóa với thành phần <t:loop> trong Tapestry

“Không thể tìm thấy một sự ép buộc từ loại java.lang.String gõ [addressUsageValue] coercions sẵn:. .........”

Dưới đây là các mẫu mã

<t:loop source="addressUsageInfo" value="addressUsageValue"> 
        <tr> 
           <td>${addressUsageValue?.usage}</td> 
           <td>${addressUsageValue?.address}</td> 
           <td>${addressUsageValue?.postCode}</td> 
           <td>${addressUsageValue?.city}</td> 
           <td>${addressUsageValue?.country}</td> 
        </tr> 
</t:loop> 

Tôi đã làm một số goggling và tìm thấy dưới đây tài liệu tham khảo.

http://tapestry.apache.org/5.3.3/apidocs/org/apache/tapestry5/corelib/components/Loop.html https://issues.apache.org/jira/browse/TAP5-609

Vì vậy, tôi đã tạo ra bộ mã hóa cho Loop. Dưới đây là mã mẫu. Ở bên dưới phương thức toClient() Tôi đã trả về ngẫu nhiên bất kỳ giá trị nào và trong phương thức toValue() Tôi trả về giá trị rỗng.

private final ValueEncoder<DtoAddressUsageInfo> addressUssageEncoder = 
    new ValueEncoder<DtoAddressUsageInfo>() { 

    public String toClient(DtoAddressUsageInfo value) { 
      return String.valueOf(value.getUsage()); 
    } 

    public DtoAddressUsageInfo toValue(String clientValue) { 
      return null; 
    } 

}; 

Bây giờ mã của tôi đang hoạt động tốt và tôi có thể gửi biểu mẫu.

đây nghi ngờ của tôi đến

Đệ Nhất - Tôi không thể hiểu tại sao bộ mã hóa là cần thiết khi sử dụng vòng lặp ?? Và nếu nó được yêu cầu để gửi biểu mẫu thì tại sao nó không phải là tham số bắt buộc ??

Thứ hai - Tôi vừa triển khai Bộ mã hóa mà không có bất kỳ logic nào. Tôi không thể hiểu được phương thức toValue() và toClient() được sử dụng và mục đích là gì?

Thứ ba - khi tôi gửi Trang tại sao biểu mẫu yêu cầu Bộ mã hóa ??

Trả lời

6

Thông số formStateencoder giải quyết vấn đề sau: Khi biểu mẫu được gửi, làm cách nào để đảm bảo các giá trị từ biểu mẫu chuyển đến các đối tượng mà chúng dự định?

Nếu bộ sưu tập bạn đang lặp lại không thay đổi giữa việc hiển thị biểu mẫu và gửi biểu mẫu, thì giải pháp đơn giản nhất là đặt formState="iteration" (được giải thích độc đáo in the docs).

Nếu, tuy nhiên, bộ sưu tập có thể thay đổi giữa hiển thị và gửi, bạn sẽ phải mã hóa thông tin về vòng lặp lặp lại là đối tượng nào. Việc này được thực hiện với một số ValueEncoder (một lần nữa, được giải thích một cách độc đáo ở số its documentation). Ví dụ, việc triển khai phổ biến có thể mã hóa ID cơ sở dữ liệu thành biểu mẫu (toClient()) khi hiển thị và tải thực thể trở lại từ cơ sở dữ liệu khi biểu mẫu được gửi (toValue()).

Tất cả điều này cũng được giải thích rõ trong số Loop component documentation that you found.

+0

cảm ơn rất nhiều @Henning. Tôi đạt được rồi :) –

1

Câu trả lời của Henning cũng giúp tôi. Giá trị cho vòng lặp của tôi sẽ chỉ bật null khi cố gắng đặt hộp kiểm cho một hàng trong vòng lặp của tôi. Bộ mã hóa hoạt động và dữ liệu trở nên tốt.Hộp kiểm được thiết lập với một setter và lấy ra với một getter cho mỗi lần lặp, mỗi hàng. Giá trị Boolean thực tế tồn tại bên trong một trình bao bọc xung quanh đối tượng dữ liệu. Vòng lặp được đưa ra một danh sách các đối tượng bao bọc này. Sự kiện 'on onClick' gửi biểu mẫu. Nhưng mỗi lần lặp lại đối tượng bao bọc của tôi (giá trị vòng lặp) sẽ luôn là null. Tôi đã thêm formstate = "iteration" và bây giờ các hộp kiểm giữ trạng thái của chúng.

<t:loop t:source="treeNodeList" value="treeNode" 
t:encoder="treeNodeEncoder" formState="iteration"> 
    <tr style="text-align:center;"> 
     <td class="table-checkbox" id="data-table-1st-col"> 
     <input t:type="checkbox" value="currentSelectedTreeNode" 
     onclick="this.form.submit();"/> 

    .... 

     </td> 
    </tr> 
</t:loop>