2015-11-16 7 views
6

मैंने thismeteor search-source पर ट्यूटोरियल का पालन किया और उदाहरण को संशोधित किया ताकि यह मेरी वर्तमान आवश्यकताओं के अनुरूप हो। यह मेरा collections.js जो मेरे lib निर्देशिका में स्थित हैउल्का खोज-स्रोत पैकेज का उपयोग करने का प्रयास करते समय मुझे कोई त्रुटि क्यों मिल रही है?

Guides = new Mongo.Collection("guides"); 

मैं अपने ग्राहक पक्ष नियंत्रक में कोड निम्नलिखित है।

var options = { 
    keepHistory: 1000 * 60 * 5, 
    localSearch: true 
}; 

var fields = ['title']; 

GuideSearch = new SearchSource('guides', fields, options); 

Template.guide_list.helpers({ 
    getGuides: function() { 
     return GuideSearch.getData({ 
      transform: function (matchText, regExp) { 
       return matchText.replace(regExp, "<b>$&</b>") 
      } 
     }); 
    }, 

    isLoading: function() { 
     return GuideSearch.getStatus().loading; 
    } 
}); 


Template.guide_list.events({ 
    "keyup #title": _.throttle(function(e) { 
     var text = $(e.target).val().trim(); 
     GuideSearch.search(text); 
    }, 200) 
}); 

और ये मेरे सर्वर साइड कोड

SearchSource.defineSource('guides', function(searchText, options) { 
    if(searchText) { 
    var regExp = buildRegExp(searchText); 
    var selector = {title: regExp} 
    return Guides.find(selector, options).fetch(); 
    } else { 
    return Guides.find({}, options).fetch(); 
    } 
}); 

function buildRegExp(searchText) { 
    // this is a dumb implementation 
    var parts = searchText.trim().split(/[ \-\:]+/); 
    return new RegExp("(" + parts.join('|') + ")", "ig"); 
} 

किसी कारण के रूप में, मैं जब मेरे इनपुट क्षेत्र

Exception in delivering result of invoking 'search.source': Meteor.makeErrorType/[email protected]://10.0.3.162:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:525:15 
[email protected]://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:4625:23 
Connection/[email protected]://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:3365:7 
._launchConnection/self.socket.onmessage/<@http://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:2734:11 
[email protected]://10.0.3.162:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:149:7 
._launchConnection/[email protected]://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:2733:9 
[email protected]://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:173:9 
[email protected]://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:1158:5 
[email protected]://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:1216:13 
SockJS.websocket/[email protected]://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:1363:9 

में कुछ लिखकर निम्न त्रुटि संदेश प्राप्त होता है यह मेरा टेम्पलेट कोड है :

template(name="guide_list") 
    .format-properly 
     .container-fluid 
      .input-group#adv-search 
       .form-horizontal(role="form" method="POST" action="#") 
        .col-md-6 
         .form-group 
          label(for="contain") Guide title 
          input.form-control(type="text" id="title") 
        .col-md-6 
         .form-group 
          label(for="contain") Author 
          input.form-control(type="text" name="author") 
        .col-md-6 
         .form-group 
          label(for="hero") Select a hero 
          select.form-control(name="hero") 
           option(value="all" selected) All Heroes 
           option(value="Druid") Druid 
           option(value="Hunter") Hunter 
           option(value="Mage") Mage 
           option(value="Paladin") Paladin 
           option(value="Priest") Priest 
           option(value="Rogue") Rogue 
           option(value="Shaman") Shaman 
           option(value="Warlock") Warlock 
           option(value="Warrior") Warrior 
        .col-md-6 
         .form-group 
          label(for="filter") Filter by 
          select.form-control(name="filterBy") 
           option(value="0" selected) All guides 
           option(value="most_viewed") Most viewed 
           option(value="top_rated") Top rated 
           option(value="most_commented") Most commented 

     .container-fluid 
      .table-responsive 
       table.table.table-hover 
        thead 
         tr 
          th hero 
          th title 
          th author 
          th updated 
          th dust 
          th 
           span.glyphicon.glyphicon-eye-open 
          th 
           span.glyphicon.glyphicon-heart 
          th 
           span.glyphicon.glyphicon-comment 
        tbody 
         each guides 
          tr 
           td {{hero}} 
           td 
            a(href="/guide/{{formatId _id}}") {{title}} 
           td {{authorUsername}} 
           td {{moFormat modifiedAt 'YYYY-MM-DD'}} 
           td {{dust}} 
           td {{hitCount}} 
           td {{rating}} 
           td {{commentCount}} 

        tbody 
         each getGuides 
          tr 
           td {{hero}} 
           td 
            a(href="/guide/{{formatId _id}}") {{title}} 
           td {{authorUsername}} 
           td {{moFormat modifiedAt 'YYYY-MM-DD'}} 
           td {{dust}} 
           td {{hitCount}} 
           td {{rating}} 
           td {{commentCount}} 

किसी भी मदद या सुझाव की अत्यधिक सराहना की जाती है!

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

+0

'गाइड्स = नए Mongo.Collection (" गाइड ");' में परिभाषित किया जा रहा है क्लाइंट साइड स्क्रिप्ट। सर्वर साइड स्क्रिप्ट में 'गाइड' को भी बुलाया जा रहा है, लेकिन यह उपलब्ध नहीं है क्योंकि इसे क्लाइंट स्क्रिप्ट में परिभाषित किया गया था। कोड की उस पंक्ति को एक 'lib' फ़ोल्डर में जेएस फ़ाइल में ले जाने का प्रयास करें, इसलिए यह सर्वर और क्लाइंट दोनों पर उपलब्ध होगा। यदि ऐसा नहीं है, तो क्या आप अपने टेम्पलेट से HTML शामिल कर सकते हैं। –

+0

@BrianShamblen संग्रह घोषणा दोष नहीं थी। लेकिन मैंने अपनी पोस्ट संपादित की और अपना टेम्पलेट पोस्ट किया :) –

+0

मेरा मानना ​​है कि यह (अनियंत्रित) मुद्दे के कारण है जो मैंने अपने उत्तर में उल्लेख किया है। यदि नहीं, तो जांचें कि सर्वर लॉग में कोई त्रुटि है या नहीं। इस पैकेज को थोड़ा प्यार और अद्यतन करने की आवश्यकता है :) – MasterAM

उत्तर

3

मुझे विश्वास है कि इस मुद्दे को GuideSearch.search विधि के लिए पारित options का अभाव है करने के लिए search-source पैकेज अद्यतन किया गया।

इससे खोज परिभाषा हैंडलर को null विकल्प के लिए प्राप्त होता है।

SearchSource.defineSource('guides', function(searchText, options) { 
    if(searchText) { 
    var regExp = buildRegExp(searchText); 
    var selector = {title: regExp} 
    return Guides.find(selector, options).fetch(); //illegal 
    } else { 
    return Guides.find({}, options).fetch(); 
    } 
}); 

इस संग्रह के find() विधि एक अशक्त options तर्क हो रही, कि, अगर आपूर्ति की, एक वस्तु (और नहीं null) होना चाहिए का परिणाम है।

इसलिए, या तो डेटा स्रोत में एक अशक्त options के लिए जाँच करें और find() विधि के लिए एक खाली वस्तु (या कुछ भी नहीं) पास, या GuideSearch.search() विधि के लिए एक खाली वस्तु पारित:

Template.guide_list.events({ 
    "keyup #title": _.throttle(function(e) { 
     var text = $(e.target).val().trim(); 
     GuideSearch.search(text, {}); // here 
    }, 200) 
}); 

आप शायद चाहिए सुनिश्चित करें कि options किसी भी मामले में @ webdeb के उत्तर में सर्वर विधि में null नहीं है।

साथ ही, इस समय कुछ पैकेज (check और ejson) के रूप में meteorhacks:search-source पैकेज उन्हें एक निर्भरता की घोषणा के बिना उपयोग करता को अपने ऐप्लिकेशन पर निर्भरता के रूप में जोड़ा जाना है। यह v1.2.0 में पेश किए गए बदलाव के कारण है। (इससे पहले उन प्रतीकों को स्वचालित रूप से संकुल के लिए उपलब्ध थे)।

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

Template.guide_list.onCreated(function() { 
    GuideSearch.search('', {}); 
}); 

को खोज परिणामों में सही ढंग से शीर्षक प्रदर्शित करने के लिए आपको इस्तेमाल कर सकते हैं Spacebars.SafeString() ताकि आग एचटीएमएल के रूप में यह रेंडर करने के लिए जानता है।अपने matchText जब ऐसा करने को साफ़ करने में सुनिश्चित हो:

a(href="/guide/{{formatId _id}}") {{{title}}} 

चेतावनी:

Template.guide_list.helpers({ 
    getGuides: function() { 
     return GuideSearch.getData({ 
      transform: function (matchText, regExp) { 
       return Spacebars.SafeString(matchText.replace(regExp, "<b>$&</b>")) 
      } 
     }); 
    }, 
    formatId: function(id) { 
     return id; 
    }, 
    moFormat: function(date, format) { 
     return moment(date).format(format); 
    }, 
    isLoading: function() { 
     return GuideSearch.getStatus().loading; 
    } 
}); 

Template.guide_list.events({ 
    "keyup #title": _.throttle(function(e) { 
     var text = $(e.target).val().trim(); 
     GuideSearch.search(text, {/* your options here */}); 
    }, 200) 
}); 

या वैकल्पिक रूप से, ट्रिपल ब्रेस संकेतन का उपयोग।

प्रकाशनों के परिणामों के साथ कुछ लेना देना नहीं चाहिए, क्योंकि पैकेज अपने संग्रह का उपयोग करता है।

+1

मैं चिंतित हूं। मेरे पास मेरी मशीन पर एक वर्किंग वर्जन है। केवल एक चीज जो मुझे करना था वह 'चेक' और' ejson' जोड़ता है, क्योंकि पैकेज निर्भरता घोषित किए बिना उनका उपयोग करता है (क्योंकि वे स्वचालित रूप से उपलब्ध नहीं होते हैं क्योंकि वे v1.2.0 से पहले थे) और सुनिश्चित करें कि 'विकल्प' तर्क सर्वर पर 'Guides.find() 'को प्रदान किया गया था' शून्य 'नहीं था। – MasterAM

+0

आप आदमी हैं! अब यह आकर्षण की तरह काम करता है =)! बस 'चेक' और' ejson' पैकेज जोड़ना पड़ा। यदि आप इसे अपने उत्तर में जोड़ देंगे तो शायद अच्छा होगा :) वैसे, जब मैं अपना टेम्पलेट प्रस्तुत करता हूं तो शुरुआत में कोई परिणाम नहीं होता है। बस जब मैं फ़ील्ड की खोज करता हूं तो वे दिखाई देते हैं। उपयोगकर्ता ने कुछ खोजने से पहले शुरुआत में उपलब्ध सभी संभावित प्रविष्टियों को प्रदर्शित करने के लिए आप क्या करते हैं? –

+1

इसे सुनकर खुशी हुई। मैंने आपको कुछ छोटे मुद्दों को शुरू करने और हल करने के लिए कुछ स्पष्टीकरण जोड़े। – MasterAM

1

मैं @MasterAM से जवाब के साथ सहमत हैं, लेकिन हल करने के लिए इस समस्या को सिर्फ अपने SearchSource समारोह में रखते:

SearchSource.defineSource('guides', function(searchText, options) { 
    options = options || {}; // to be sure, that options is at least an empty object 
    if(searchText) { 
    var regExp = buildRegExp(searchText); 
    ... 
संबंधित मुद्दे

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