json - फ़िल्टरिंग एक क्वेरी के साथ चयन करें रीडस्टोर: चयन छड़ी नहीं है





dojo autocomplete (6)


आज भी यही समस्या है, जो दोोज संस्करण 1.1.1 और 1.2.0 को प्रभावित करता है।

जहाँ तक मैं समझ सकता हूँ कि, फ़िल्टरिंग चयन को अंतिम क्वेरी के बाद उपयोगकर्ता फ़ील्ड छोड़ देता है और उम्मीद करता है कि क्वेरी के परिणाम में केवल एक परिणाम होता है, जो यह तब फ़ील्ड के मान के लिए उपयोग करता है।

यह मेरे लिए एक बग की तरह लग रहा है (हालांकि मुझे उम्मीद है कि मैं गलत साबित हो रहा हूं), लेकिन एक के लिए आपको अभी भी साथ करना पड़ सकता है

इस पृष्ठ पर कुछ (अपूर्ण) सूचना है: http://www.nabble.com/Problems-with-QueryReadStore-td19269498.html

बाद में संपादित करें:

यदि वास्तव में आपको फ़िल्टरिंग चयन के साथ एक ही समस्या है, इसके पीछे डेटा संग्रह की परवाह किए बिना, जब भी डुप्लिकेट लेबल हों

उदाहरण के लिए, जब विजेट फोकस खो देता है, तो इसे पहले विकल्प पर रीसेट कर दिया जाता है:

 <select id="coffee2" name="coffee2" 
    dojotype="dijit.form.FilteringSelect" 
    autoComplete="false">
    <script type="dojo/method" event="onChange"  args="newValue">
        console.log(dijit.byId('coffee2').getValue() + '/' + dijit.byId('coffee2').getDisplayedValue());
    </script>
    <option value="0">AAA</option>
    <option value="1">AAA</option>
    <option value="2">AAA</option>
    <option value="3">AAA</option>
    <option value="4">AAA</option>
  </select>

मेरी राय में एक फीचर से अधिक एक बग

मैं एक dijit.form.FilteringSelect का उपयोग कर रहा dijit.form.FilteringSelect द्वारा समर्थित का चयन करने के लिए उपयोगकर्ता को एक क्षेत्र का चयन करने के लिए ("ऑटो-पूर्ण" तंत्र लगता है)। उपयोगकर्ता द्वारा दर्ज किए गए प्रत्येक वर्ण पर, QueryReadStore मिलान करने वाले क्षेत्रों (संबंधित आईडी के साथ) की QueryReadStore सूची का इंतजार कर, सर्वर पर अनुरोध भेजता है। जब तक एक छोटी पर्याप्त सूची दिखाई जाती है, उपयोगकर्ता वांछित आइटम को चुनता है। [बेशक, हर कीस्ट्रोक पर पूछताछ सबसे कुशल पैटर्न नहीं है, लेकिन अब यह काफी अच्छा है।]

अप्रत्याशित व्यवहार: कुछ दुर्लभ लेकिन विशिष्ट अवसरों में, उपयोगकर्ता द्वारा बनाई जाने वाली पसंद "छड़ी नहीं करता" उदाहरण के लिए, यदि उपयोगकर्ता प्रकार " can ", तो उस क्रम में निम्नलिखित विकल्पों के साथ प्रस्तुत किया जाता है:

Atlantic Canada
Canada
English Canada
Lower Canada
Upper Canada
Western Canada

अगर वह इनके बीच " Canada " चुनती है, तो डीआईजीट ड्रॉप डाउन चयन को बंद कर देता है, जिसने उसकी पसंद को सही तरीके से चुना है। लेकिन उपयोगकर्ता द्वारा फ़ील्ड छोड़ने वाले समय से, चयन " Atlantic Canada " पर जाता है!

यह विचित्र घटना कुछ विशिष्ट क्षेत्रों की एक छोटी संख्या के लिए व्यवस्थित रूप से होती है। (सबसे पहले, मैंने सोचा था कि बुरे व्यवहार वाले क्षेत्रों के बीच सामान्य कारक यह था कि उनके नाम में उच्चारण अक्षर या हाइफ़न होते हैं, लेकिन कनाडाई उदाहरण के साथ स्पष्ट रूप से ऐसा नहीं है। अब तक, मैं एक नियमित पैटर्न को खोजना नहीं चाहता।

मुझे कहीं भी एक जैसी समस्या का कोई उल्लेख नहीं मिला है। मैं पूरी तरह से जांच करने के लिए तैयार हूं, लेकिन, जैसा कि मैं डोजो में नया हूँ, मैं डोगो के कोड के अंदर आने से पहले संकेतकों की सराहना करता हूं: मुझे पहले कहाँ देखना चाहिए? कुछ संभावित समस्याएं हैं जो उस व्यवहार का कारण बन सकती हैं? क्या मैं निश्चित अवधारणाओं को छोड़ सकता हूं? कंसोल (या फ़ायरबग) का सबसे अच्छा उपयोग करने के लिए मुझे इस के नीचे कैसे जाना चाहिए? आदि।

समस्या दो dojo 1.1.1 और dojo 1.2.3 के साथ होती है।

यहाँ FilteringSelect के चयन (प्रोग्रामेटिक) है:

new dijit.form.FilteringSelect({
   name = "region";
   autoComplete = false;
   hasDownArrow = false;
   labelAttr = "name";
   queryExpr = "${0}";
   store = new dojox.data.QueryReadStore({url:'/query/regions'});
}, myNode);

संपादित करें (2009/02/18): अतिरिक्त विवरण

डेमलिन के उत्तर के बाद, मैं यह जानना चाहता था कि इस स्थिति के बारे में FilteringSelect का चयन करें। मान लीजिए कि मैं FilteringSelect onChange घटनाओं को onChange और onBlur लॉगिंग फ़ंक्शंस से कनेक्ट करता हूं, मुझे निम्नलिखित प्ले-बाय-प्ले अनुक्रम मिलता है:

  • मैं फ़ील्ड में और क्लिक करें: can
  • 6 क्षेत्रों (ऊपर सूचीबद्ध) की ड्रॉप-डाउन सूची दिखाई देती है
  • कुंजीपटल कर्सर के साथ, मैं " Canada " (जो आईडी 1 के साथ क्षेत्र है) की सूची को नीचे ले जाता हूं
  • मैं प्रेस (इस प्रकार दुकान के एक आइटम का चयन ) दबाएँ ड्रॉप-डाउन सूची अब गायब हो गई है और फ़ील्ड में टेक्स्ट " Canada " दिखाई देता है। इस बिंदु पर, निम्न लॉगिंग के साथ पहली घटना निकाल दी गई है:

    onChange event: region 1
  • मैं tab दबाकर क्षेत्र को छोड़ देता हूं। यहां, दो घटनाओं को एक दूसरे के बाद निकाल दिया जाता है, निम्न क्रम में:

    onBlur event: region 1
    onChange event: region 246

(क्षेत्र 246 Atlantic Canada ।) अब यह बहुत ही रोचक है ... जब तक मैं क्षेत्र छोड़ देता हूं (पर ब्लूर), Canada अभी भी चयनित मान है। रहस्यमय स्वैप उसके बाद ही होता है ...




बेनाम: अरे नहीं, यह विशेष समस्या मेरे गधे में एक असली दर्द भी था !! और यहां बताया गया है कि मैं इससे कैसे छुटकारा पा चुका हूं, डैमलिन उत्तर के लिए धन्यवाद।

मेरे मामले में, dijit.form.filteringSelect एक dojox.data.QueryReadStore द्वारा समर्थित का dijit.form.filteringSelect एक स्वरूपित स्ट्रिंग से भरे जाने के लिए आवश्यक था जो कि कई डीबी मूल्यों से जटिल तालिकाओं से आ रहा है (कुछ माता-पिता और यहां तक ​​कि बहुत सारे संबंधों के साथ)। कृपया मत पूछिए, बस विचार करें कि मैं जितनी जल्दी हो सके डीबी तालिकाओं को अलग करना पसंद करता हूं, ताकि डुप्लिकेट से बचने के लिए। ये सब ज़ेंड फ़्रेमवर्क एप्लिकेशन के संदर्भ में है, जहां QueryReadStore एक नियंत्रक की कार्रवाई द्वारा परोसा जाता है, जिसे मैं यहां QueryReadStore नाम देता हूं।

इसलिए, Damelin जवाब से शुरू, मैं अपने autocompletelisteAction पर काम शुरू कर दिया QueryReadStore अनुरोध के दो मामलों को अलग करने के लिए, जीईटी पैरामीटर पढ़ना और इसके अंतिम तारांकन

सबसे पहले, मैं पैरामीटर को साफ करता हूं और इसके अंतिम चारों की खोज करता हूं:

$txt = (String) $this->_request->getParam('parameter');
$lastChar = substr($txt, -1);

उसके बाद, यदि पैरामीटर 1 से अधिक वर्ण और अंत में कोई तारांकन नहीं है, तो मैं अपने $txt पैरामीटर से छुटकारा $txt और हाथों से मेरी तरह की क़ब्ज़ियाँ बनाऊँगा:

if ((strlen($txt) >= 1) && ($lastChar != '*')) {
  // here, the parameter is the full text, which the user selected by
  // clicking on a shown element of the filteringSelect

  // Therefore, I "explode" the parameter to correspond to my searched values
  // and I build my SQL LIKE clauses without "%"
  // Consequence? There is only one result which is the good one.
}
else {
  // here, the parameter is a "part" of the search, which the user typed in

  // Therefore, I build my SQL LIKE clauses with "%$txt%"
}
// Here I can just launch my SQL queries with the built LIKE clauses
// and return result(s) to the QueryReadStore

क्यों जाँच $txt एक से अधिक char है? क्योंकि ज़ेंड फ़्रेमवर्क के भीतर, कभी-कभी मैं फ़िल्टरिंग को "ऑटोलोड" कर सकता हूं, पृष्ठ के साथ चयन करें, जो पूरी तरह से खाली तर्क भेजता है (यहां तक ​​कि तारांकन के बिना), जो तब मेरे "विस्फोट" फ़ंक्शन पर जाना होगा।

यह जटिल परिदृश्य मेरा है, लेकिन मुझे लगता है कि सही जवाब देने के लिए प्रत्येक पैरामीटर पर इस सरल PHP टेस्ट को अनुकूलित कर सकता है।

इसलिए असली काम यहां पर डेमलिन द्वारा किया गया क्योंकि उन्होंने डोजो तत्वों के कारणों की जांच की




पीएनटी की टिप्पणी के बाद ...

यह चर्चा स्पष्ट करती है कि समस्या कहां है: "ब्लर" पर, QueryReadStore आखिरी बार सर्वर के लिए फिर से पूछताछ करता है, जो कि DisplayedValue का उपयोग अपनी क्वेरी-स्ट्रिंग के रूप में करता है।

मेरे उदाहरण में, यह " Canada " होगा। यह देखते हुए कि मेरी शॉर्टलिस्ट (आगे देखें) में छह क्षेत्रों में यह स्ट्रिंग होती है और मेरा सर्वर क्वेरी स्ट्रिंग युक्त सभी आइटमों की वर्णानुक्रमिक सूची वापस करने के लिए क्रमादेशित है (और केवल उन लोगों के साथ शुरू नहीं), फिर से पूरी सूची लौटे, और FilteringSelect सेलेक्ट इन के बीच पहला आइटम उठाता है - जो इस मामले में " Atlantic Canada " है

अगर मैं अपने विश्लेषण में सही हूं, तो मेरे लिए एक संभावित तरीका आगे बढ़ना होगा ताकि मेरी क्वेरी सेवा को पुन: लागू किया जा सके ताकि सूची के शीर्ष पर (वर्णानुक्रम से पहले) किसी भी आइटम को क्वेरी स्ट्रिंग से मेल खाता हो।




हमें यह समस्या एक ही समस्या थी। हम तुरंत तुरंत वापस करने के लिए FilteringSelect.js में _setDisplayedValueAttr संशोधित करके हल किया:

_setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){ return }

यह एक दिन के लिए हमारे सिर को तोड़ने के बाद है, यह परिवर्तन स्पष्ट रूप से बहुत बुरा है, लेकिन यह हमारे लिए काम किया है।

अंतर्निहित समस्या _callbackSetLabel में इस पंक्ति के साथ कुछ करना है:

this._setValueFromItem(result[0], priorityChange);

यही वजह है कि परिणाम मूल्य सूची में आपके मूल्य को पहले के रूप में सेट किया जा रहा है। मुझे नहीं पता क्यों यह इस तरह से है

आशा है कि यह आपके लिए काम किया है, हम जिस तरह से फ़िल्टरिंग सेलेक्ट.जेस के ट्रंक संस्करण का उपयोग कर रहे हैं ( http://trac.dojotoolkit.org/browser/dijit/trunk/form/FilteringSelect.js )




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

जैसा कि मैंने सोचा, उपयोगकर्ता इनपुट फ़िल्टरिंग के अंत में स्टोर से उम्मीद की जाती है (केवल इस मामले में QueryReadStore) केवल उन आइटम्स को वापस करने के लिए जो बिल्कुल मैच या चयनित स्ट्रिंग हैं। फ़िल्टरिंगसहेजें कि जब इनपुट दबाया जाता है या उपयोगकर्ता फ़ील्ड छोड़ता है तो इनपुट समाप्त हो जाता है। इस दो घटनाओं से पहले, पाठ, जो डाला या चुना गया है, सिर्फ पाठ है वास्तव में इस समय कोई आइटम नहीं चुना जाता है

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

जैसा कि आप उल्लेख करते हैं, QueryReadStore प्रत्येक कीस्ट्रोक पर अनुरोध भेजता है। इस मामले पर (इनपुट समाप्त होने से पहले) छानने का चयन करें उम्मीद है कि स्टोर उन पैटर्नों को वापस करेगा जो पैटर्न से मेल खाते हैं। डिफ़ॉल्ट रूप से "प्रविष्टि स्ट्रिंग" है, जहां asteriks कोई क्रम है

दो मामलों के बीच अंतर करने के लिए, QueryReadStore slighlty भिन्नताएं निर्दिष्ट करती है:

  • प्रत्येक कीस्ट्रोक पर नमूना अनुरोध: / क्वेरी / क्षेत्रों? नाम = दर्ज स्ट्रिंग * और प्रारंभ = 0 और गणना = 5
  • इनपुट के अंत पर नमूना अनुरोध: / क्वेरी / क्षेत्रों? नाम = प्रविष्ट स्ट्रिंग और प्रारंभ = 0

जैसा कि आप देखते हैं, दूसरे अनुरोध में "प्रविष्टि स्ट्रिंग" के अंत में कोई ऐस्टरिक नहीं है यह भिन्नता सर्वर साइड पर सही प्रतिक्रिया बनाने में मदद कर सकती है।

मुझे आशा है कि मैंने इसे अच्छी तरह समझाया है। यदि नहीं, तो पूछने के लिए आपका स्वागत है




मैंने इसे 5 साल पहले लागू किया जब डोजो 0.2 पर था:

जबकि कोड प्राचीन है, यह छोटा है, और उम्मीद है कि यह आपको इस पर विचार करने के तरीके पर विचार देगा। मोटा स्केच:

  • अपने इनपुट बॉक्स में इवेंट हैंडलर संलग्न करें, जो परिवर्तनों पर ट्रिगर होता है - इनपुट बॉक्स में बदलाव का पता लगाने के लिए "ऑनकीप" का उपयोग करें।
  • प्रतीक्षा करें जब तक कि उपयोगकर्ता आपके ईवेंट हैंडलर में टाइमर सेट करके टाइपिंग बंद नहीं कर लेता है, अगर यह अभी तक सेट नहीं है। 200-500ms अच्छे प्रतीक्षा समय हैं।
    • टाइमआउट एक दोहरी भूमिका निभाता है:
      • यह ओवरलोडिंग को रोकने के लिए सर्वर से हमारे अनुरोधों को थ्रॉटल करता है।
      • यह समय और हमारी टाइपिंग आदतों की हमारी धारणा पर चलता है।
  • यदि हमारा टाइमआउट चालू है, और हम सर्वर की प्रतीक्षा नहीं करते हैं ⇒ सर्वर को एक स्ट्रिंग भेजें जो हमारे पास है।
  • अगर हम अभी भी सर्वर की प्रतीक्षा कर रहे हैं, तो अनुरोध रद्द करें और फिर से पूछें।
    • यह हिस्सा ऐप-विशिष्ट है: हम सर्वर को अधिभारित नहीं करना चाहते हैं, और कभी-कभी सर्वर टूटे हुए कनेक्शन को अच्छी तरह से संभाल नहीं सकता है।
    • उदाहरण में मैं एक्सएचआर कॉल रद्द नहीं करता हूं, लेकिन नया अनुरोध सबमिट करने से पहले इसे पूरा करने के लिए प्रतीक्षा करें।
  • सर्वर प्रासंगिक परिणामों के साथ प्रतिक्रिया करता है, जो तुरंत दिखाए जाते हैं।

ब्लॉग पोस्ट में मैंने इसे एक विजेट के रूप में कार्यान्वित किया। जाहिर है कि सटीक पैकेजिंग आपके ऊपर है।







json dojo autocomplete