[英]Why am I getting an error when attempting to use the Meteor search-source package?
我在流星搜索源上遵循了本教程,並修改了示例,使其適合我當前的需求。 這是我的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/errorClass@http://10.0.3.162:3000/packages/meteor.js?9730f4ff059088b3f7f14c0672d155218a1802d4:525:15
._livedata_result@http://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:4625:23
Connection/onMessage@http://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
_.forEach@http://10.0.3.162:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:149:7
._launchConnection/self.socket.onmessage@http://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:2733:9
REventTarget.prototype.dispatchEvent@http://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:173:9
SockJS.prototype._dispatchMessage@http://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:1158:5
SockJS.prototype._didMessage@http://10.0.3.162:3000/packages/ddp-client.js?250b63e6c919c5383a0511ee4efbf42bb70a650f:1216:13
SockJS.websocket/that.ws.onmessage@http://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}}
任何幫助或建議都將受到高度贊賞!
編輯:我將search-source
包更新為1.4.2
我認為問題在於缺少傳遞給GuideSearch.search
方法的options
。
這導致搜索定義處理程序的選項為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()
方法獲得null options
參數,如果提供該參數,則該參數必須是一個對象(而不是null
)。
因此,要么檢查數據源中的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
不為null
,就像@webdeb的答案一樣。
此外,由於meteorhacks:search-source
軟件包在不聲明依賴的情況下使用了它們,因此目前必須將某些軟件包( check
和ejson
)作為依賴添加到您的應用中。 這是由於v1.2.0中引入的更改。 (在此之前,這些符號將自動提供給軟件包)。
為了使所有結果最初都可用,可以在首次創建模板時觸發搜索。 請注意,當您有大量數據時,這可能會非常昂貴,因此您可能應該限制服務器上搜索定義處理程序返回的結果。
Template.guide_list.onCreated(function () {
GuideSearch.search('', {});
});
為了在搜索結果中正確顯示標題,您可以使用Spacebars.SafeString()
以便大膽知道如何將其呈現為HTML。
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)
});
或者,使用三括號符號:
a(href="/guide/{{formatId _id}}") {{{title}}}
警告 :在執行此matchText
時,請matchText
。
出版物應該與結果無關,因為程序包使用自己的集合。
我同意@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);
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.