2012-06-22 9 views
5

में घटक के साथ एनकोडर मेरे पास एक पृष्ठ है जो कुछ क्लाइंट का विवरण प्रदर्शित कर रहा है। मैं कुछ डेटा प्रदर्शित करने के लिए t:loop का उपयोग कर रहा हूं। t:loop में मैं बस source और value पास कर रहा हूं। अब तक इतना अच्छा है, मेरा पृष्ठ ठीक काम कर रहा है। लेकिन जब मैं पेज सबमिट करने का प्रयास करता हूं तो अचानक मुझे अपवाद देता है। टेपेस्ट्री

"प्रकार java.lang.String से बलात्कार [addressUsageValue] उपलब्ध coercions टाइप करने के लिए नहीं मिल सका:। ........."

नीचे नमूना कोड

<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> 
है

मैंने कुछ गॉगलिंग किया और संदर्भों को नीचे पाया।

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

तो मैं लूप के लिए एनकोडर बनाया है। नीचे नमूना कोड है। toClient() विधि में मैंने यादृच्छिक रूप से किसी भी मान को वापस कर दिया है और toValue() विधि में मैं शून्य लौट रहा हूं।

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; 
    } 

}; 

अब मेरा कोड ठीक काम कर रहा है और मैं फॉर्म जमा करने में सक्षम हूं।

यहाँ मेरी संदेह आता

पहले - मुझे समझ में क्यों एनकोडर पाश का उपयोग करते समय की आवश्यकता है नहीं पा रहा हूँ ?? और यदि फॉर्म जमा करना आवश्यक है तो यह अनिवार्य पैरामीटर क्यों नहीं है ??

दूसरा - मैंने बिना किसी तर्क के एन्कोडर को अभी लागू किया है। मैं समझ नहीं पा रहा हूं कि कहां सेव्यू() और toClient() विधि का उपयोग किया जाता है और उद्देश्य क्या है?

तीसरा - जब मैं पृष्ठ सबमिट करता हूं तो फॉर्म को एनकोडर क्यों आवश्यक है ?? जब फ़ॉर्म सबमिट कैसे आप वाकई रूप से मान वस्तुओं वे के लिए हैं करने के लिए जाना कर सकता हूँ:

उत्तर

6

formState और encoder मापदंडों निम्नलिखित समस्या का समाधान?

यदि आप जिस संग्रह पर पुनरावृत्ति कर रहे हैं वह फ़ॉर्म और प्रस्तुति जमा करने के बीच नहीं बदलता है, तो सबसे आसान समाधान formState="iteration" सेट करना है (अच्छी तरह से in the docs समझाया गया है)।

यदि, हालांकि, संग्रह प्रस्तुत करने और सबमिट करने के बीच संग्रह बदल सकता है, तो आपको उस ऑब्जेक्ट को एन्कोड करना होगा जिस पर लूप पुनरावृत्ति है। यह ValueEncoder (फिर से, its documentation में अच्छी तरह से समझाया गया है) के साथ किया जाता है। एक सामान्य कार्यान्वयन उदाहरण के लिए प्रपत्र (toClient()) में डेटाबेस आईडी को एन्कोड कर सकता है, और प्रपत्र सबमिट होने पर इकाई को डेटाबेस से वापस लोड कर सकता है (toValue())।

यह सब Loop component documentation that you found में भी अच्छी तरह से समझाया गया है।

+0

बहुत धन्यवाद @ हेनिंग। मैं समझ गया :) –

1

हेनिंग के उत्तर ने मुझे भी मदद की। मेरे लूप में एक पंक्ति के लिए चेकबॉक्स सेट करने का प्रयास करते समय मेरे लूप के लिए मान केवल शून्य हो जाएगा। एन्कोडर काम करता है और डेटा ठीक हो जाता है।चेकबॉक्स को एक सेटटर के साथ सेट किया गया है और प्रति पंक्ति प्रति पुनरावृत्ति के साथ पुनर्प्राप्त किया गया है। वास्तविक बूलियन मान डेटा ऑब्जेक्ट के चारों ओर एक रैपर के अंदर रहता है। लूप को इन रैपर ऑब्जेक्ट्स की एक सूची दी जाती है। एक 'ऑनक्लिक' ईवेंट फॉर्म सबमिट करता है। लेकिन प्रति पुनरावृत्ति मेरे रैपर ऑब्जेक्ट (पाश मूल्य) हमेशा शून्य होगा। मैंने फॉर्मस्टेट = "पुनरावृत्ति" जोड़ा और अब चेकबॉक्स अपने राज्य को बनाए रखते हैं।

<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> 
संबंधित मुद्दे