2012-03-15 11 views
5

के क्लिक पर Xpages अधिक फ़ील्ड (असीमित) x x के साथ शुरू करना चाहते हैं। फ़ील्ड (मेरे ऐप में मेरे पास टेक्स्ट डेटा डेटा और न्यूमेरिक डेटा फ़ील्ड की एक जोड़ी है) एक xpage एप्लिकेशन (10 जोड़े कहें) पर और फिर जब उपयोगकर्ता "अधिक फ़ील्ड" पर क्लिक करता है, तो मैं अधिक जोड़ों को बिना पूर्ण रूप से गतिशील रूप से दिखाना चाहता हूं पृष्ठ पर रीफ्रेश करें, लेकिन असीमित नंबर चाहिए। फ़ील्ड (जब तक पृष्ठ क्रैश नहीं होता) और फिर मैं उन सभी क्षेत्रों के लिए फॉर्म और डेटा जमा करना चाहता हूं। इसे लागू करने का सबसे अच्छा तरीका क्या है?एक बटन

<inputText value="#{contact.firstName}" /> 

हालांकि, सरणी अंकन भी समर्थित है:

उत्तर

16

आमतौर पर, खेतों डॉट नोटेशन का उपयोग कर एक दस्तावेज़ डेटा स्रोत के लिए बाध्य कर रहे हैं

<inputText value="#{contact['firstName']}" /> 

बाद इस वाक्य रचना में फ़ील्ड नाम किया जा रहा है क्योंकि एक स्ट्रिंग के रूप में माना जाता है, बीन की निहित संपत्ति के रूप में नहीं, इसे गतिशील रूप से गणना की जा सकती है। इन गतिशील क्षेत्रों को परिभाषित करने का सबसे आसान तरीका जो मैंने पाया है, वह प्रत्येक मूल प्रकार के फ़ील्ड के लिए कस्टम नियंत्रण बनाना है, और डेटा स्रोत और फ़ील्ड नाम को स्वीकार करने के रूप में प्रत्येक को परिभाषित करना है। तो क्षेत्र में ही तो एक वाक्य रचना निम्न के समान के साथ समाप्त होता है:

<inputText value="#{compositeData.dataSource[compositeData.fieldName]}" /> 

कि वाक्य रचना का उपयोग करके, किसी भी जटिलता की एक गणना निर्धारित करने के लिए क्या फ़ील्ड नाम कस्टम नियंत्रण करने के लिए पारित करने के लिए इस्तेमाल किया जा सकता। परिदृश्य में आप पूरा करने के लिए प्रयास कर रहे हैं, दोहराने नियंत्रण चारों ओर से घेरे है कि क्षेत्र जोड़ी आप प्रत्येक के लिए एक क्षेत्र प्रत्यय नामित करने के लिए ... शायद निम्नलिखित की तरह कुछ की अनुमति होगी पर एक indexVar को निर्दिष्ट:

<xp:repeat indexVar="fieldSuffix" value="#{viewScope.rowCount}"> 
<xp:div> 
    <xc:dynamicInputText dataSource="#{contact}" fieldName="fullName_#{fieldSuffix}" /> 
    <xc:dynamicInputNumber dataSource="#{contact}" fieldName="phoneNumber_#{fieldSuffix}" /> 
</xp:div> 
</xp:repeat> 
इस के साथ

दृष्टिकोण, आप व्यूस्कोप में निर्दिष्ट सीमा तक "fullName_0", "fullName_1" नामक फ़ील्ड्स के साथ समाप्त हो जाएंगे। आम तौर पर, एकमात्र जटिलता यह सुनिश्चित कर रही है कि जब कोई मौजूदा दस्तावेज़ खोला जाए, तो दृश्यस्कोप चर सही सीमा पर वापस सेट हो जाता है। इसके लिए एक और दृष्टिकोण, ज़ाहिर है, वास्तव में दस्तावेज़ पर एक और वस्तु के रूप में सीमा को बचा रहा है और इसके बजाय दोहराए गए मूल्य को बाध्यकारी कर रहा है।

+0

धन्यवाद टिम, निश्चित रूप से यह एक जाने देगा और आपको पोस्ट करेगा। मैंने यह कोशिश नहीं की है, लेकिन सिर्फ यह सोचकर कि क्या मैं दोहराव नियंत्रण का आंशिक ताज़ा करता हूं, मैं मौजूदा डेटा खो नहीं पाऊंगा? – pipalia

+3

मैं वही लाइनों के साथ इसका जवाब देने के लिए काफी कुछ कर रहा था, यह विधि काम करेगी, मैं 'दोहराना सीमा' की गणना करने की अनुशंसा करता हूं ताकि दृश्यस्कोप सीमा के समान हो ताकि आपको आश्चर्य न हो कि नए फ़ील्ड क्यों नहीं दिख रहे हैं 30 हिट करने के बाद। –

+1

ग्रेट सुझाव, डेक्कन।आप निश्चित रूप से दोहराने के लिए एक पेजर भी संलग्न कर सकते हैं, लेकिन इस प्रकार के इंटरफ़ेस के लिए अधिकांश उपयोगकर्ता उम्मीद नहीं करेंगे कि पेजिनेशन को टाइप प्रकार इंटरफेस के लिए उपलब्ध तरीके से उपलब्ध कराया जाए, इसलिए बस "पंक्तियों" विशेषता को हमेशा सीमा से मिलान करने के लिए मजबूर करना है। शायद बेहतर। –

3

आप व्यायाम 23 "टेबलवाकर" पर भी देख सकते हैं। यह एकाधिक फ़ील्ड नहीं करता है लेकिन मल्टी-वैल्यू फ़ील्ड करता है जो प्रोसेसिंग और स्टोरेज के मामले में बेहतर हो सकता है (आप एक दस्तावेज़ में कितने हैं यह जानने के लिए @ एलीमेंट्स कर सकते हैं)। अभ्यास यहां है: http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Tutorial-Introduction-to-XPages-Exercise-23 जबकि बटन एक समय में केवल एक पंक्ति जोड़ता है, यह समायोजित करना आसान है।

+0

धन्यवाद, यह – pipalia

2

आप क्या कर सकते हैं 2 स्ट्रिंग मानों के साथ एक बीन है लेबल और डेटा और एक प्रबंधित बीन जिसमें उस ऑब्जेक्ट का ऐरेलिस्ट है ताकि आपके दोहराव नियंत्रण के अंदर आप ArrayList को दोहराएं और फिर अपने xp को बाध्य करें: inputText rowData.Data और your xp: rowData.Label पर लेबल तब जब आप एक और 5 पंक्तियां जोड़ना चाहते हैं तो आप केवल ऐरेलिस्ट में कई और ऑब्जेक्ट्स जोड़ते हैं, फिर अपने पृष्ठ को रीफ्रेश करें, आपका डेटा अभी भी आपकी सरणी सूची में रहेगा और आपके पास 5 होगा नई खाली वस्तुएं जहां आप डेटा जोड़ सकते हैं।

public class Data { 

private String label; 
private String data; 

public Data() { 

} 
//getters and setters 

} 

public class ManagedBean { 

private ArrayList<Data> datalist; // add a managed property for this one so It will create a new one when needed. 

// getters and setters 

public addFiveMoreObjects() { 
    Data newItem; 
    for (int i=0; i<5; i++) { 
     newItem = new Data(); 
     datalist.add(newItem); 
    } 
} 

} 

<xp:repeat value="#{managedBean.datalist}" var="rowData"> 
<xp:text value="#{rowData.label}" /> 
<xp:inputText value="#{rowData.data} /> 
</xp:repeat> 

<xp:button value="Add 5 More"> // call #{managedBean.addFiveMoreObjects} 
+0

पर जायेगा यह वास्तव में दिलचस्प लगता है और साझा करने के लिए बहुत धन्यवाद। चूंकि मैंने अभी तक जवाबीन्स देव नहीं शुरू किया है, इसलिए मैं पहले अन्य तरीकों का प्रयास कर सकता हूं। – pipalia

संबंधित मुद्दे