我正在使用Meteor:Search-source软件包为Meteor中的第一个应用程序实现一个被动搜索功能。搜索功能正常。我有一个输入文本搜索字段和2个列表。第一部分称为“搜索结果”获取我们搜索某些单词时找到的项目(例如尝试使用伦敦),第二部分获取我的集合中的所有项目。这些项目与反应性帮助/模板功能相关联。当我获得所有项目时的反应性如果我voteUp或Down则工作正常。我可以实时看到它是如何更新的。但是当我想要在我的搜索中找到一些项目时,upvote和downvote没有更新,就像找到的项目一样,失去了反应性(我可以看到,如果我在第一部分的某些项目中投票或下注(“搜索”)结果“)第二个列表中的项目(所有项目)正在更新....
这是我的应用My App
您可以在搜索字段中的“london”中查看问题密钥,并在upvote或downvote中查看该项目是否已正确更新,但如果您在“搜索结果”部分中进行了upvote或downvote,则无效没有反应)。
客户端
//辅助函数
Template.searchResult.helpers({
getItems: function() {
return itemSearch.getData({
transform: function(matchText, regExp) {
return matchText.replace(regExp, "$&")
},
sort: {upvote: -1}
});
},
isLoading: function() {
return itemSearch.getStatus().loading;
}
});
//此行默认返回所有文档(当空的搜索框文本为空时)
Template.searchResult.rendered = function() {
itemSearch.search('');
};
服务器
SearchSource.defineSource('items', function(searchText, options) {
var options = {sort: {upvote: -1}, limit: 20};
// var options = options || {};
if(searchText) {
var regExp = buildRegExp(searchText);
/*var selector = {title: regExp, description: regExp};*/
var selector = {$or: [
{title: regExp},
{description: regExp}
]};
return Websites.find(selector, options).fetch();
} else {
return Websites.find({}, options).fetch();
}
});
function buildRegExp(searchText) {
var words = searchText.trim().split(/[ \-\:]+/);
var exps = _.map(words, function(word) {
return "(?=.*" + word + ")";
});
var fullExp = exps.join('') + ".+";
return new RegExp(fullExp, "i");
}
HTML
<!-- template that displays searched website items -->
<template name="searchResult">
<div class="container">
<div class="jumbotron">
<h3> Search results </h3>
<ol>
{{#each getItems}}
{{> website_item}}
{{/each}}
</ol>
</div>
</div>
<!-- template that displays individual website entries -->
<template name="website_item">
<li>
<a href="{{url}}">{{title}}</a>
<p>
{{description}}
</p>
<a href="#" class="btn btn-default js-upvote">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"> </span>
</a>
<a href="#" class="btn btn-success">
{{upvote}}
</a>
<a href="#" class="btn btn-default js-downvote">
<span class="glyphicon glyphicon-arrow-down" aria-hidden="true"></span>
</a>
<a href="#" class="btn btn-danger">
{{downvote}}
</a>
<p>
Created On: {{createdOn}}
</p>
<a href="/details/{{_id}}" class="btn btn-success js-description">
view web description
</a>
<!-- you will be putting your up and down vote buttons in here! -->
</li>
一些建议??非常感谢提前!
答案 0 :(得分:2)
返回的数据记录本身不是被动的,因为数据是使用方法调用(search.source
)在内部获取的。
您可以获得搜索时的数据快照。
此外,默认情况下会缓存数据,因此对同一术语的后续搜索不会在一段时间内触发对服务器的请求。您可以通过keepHistory
选项调整时间段。
因此,您不会通过软件包获得被动更改,这似乎不适合您的情况。
您可以尝试通过订阅获取数据,并将搜索返回的数据映射到您的集合中的记录,但这似乎很昂贵。
此外,请参阅this issue,其中显示其他人遇到过相同类型的问题。