Javascript 使用Meteor搜索源程序包获取结果的反应性问题
Im triying使用Meteor:search源程序包为我在Meteor中的第一个应用程序实现反应式搜索功能。搜索功能工作正常。我有一个输入文本搜索字段和2个列表。第一部分称为“搜索结果”,它获取在搜索某个单词时找到的项目(例如try with london),第二部分获取我的收藏中的所有项目。这些项目链接到一个被动帮助器/模板函数。当我得到所有物品时,如果我呕吐或跌倒,反应性正常。我可以实时看到它是如何更新的。但是,当我想要向上投票或向下投票时,在我的搜索中找到的某个项目,向上投票和向下投票没有更新,就像找到的项目一样,失去了反应性(我可以看到,如果我在第一部分(“搜索结果”)的某个项目中向上投票或向下投票,则第二个列表中的项目(所有项目)正在正确更新 这是我的应用程序 您可以在搜索字段中的“伦敦”中查看问题键,并向上投票或向下投票,以查看第二个列表中的项目是否已正确更新,但如果您在“搜索结果”部分向上投票或向下投票(无反应),则该项目不起作用 客户端 //辅助函数Javascript 使用Meteor搜索源程序包获取结果的反应性问题,javascript,search,meteor,meteor-blaze,meteor-helper,Javascript,Search,Meteor,Meteor Blaze,Meteor Helper,Im triying使用Meteor:search源程序包为我在Meteor中的第一个应用程序实现反应式搜索功能。搜索功能工作正常。我有一个输入文本搜索字段和2个列表。第一部分称为“搜索结果”,它获取在搜索某个单词时找到的项目(例如try with london),第二部分获取我的收藏中的所有项目。这些项目链接到一个被动帮助器/模板函数。当我得到所有物品时,如果我呕吐或跌倒,反应性正常。我可以实时看到它是如何更新的。但是,当我想要向上投票或向下投票时,在我的搜索中找到的某个项目,向上投票和向下投
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;
}
});
//默认情况下,此行返回所有文档(当空搜索框文本为空时)
服务器
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>
搜索结果
{{{#每个getItems}
{{>网站{u项目}
{{/每个}}
{{description}}
创建日期:{{createdOn}
一些建议??非常感谢!返回的数据记录本身不是被动的,因为数据是使用方法调用在内部获取的(
search.source
)
您将获得搜索时的数据快照
此外,默认情况下会缓存数据,因此对同一术语的后续搜索在一定时间段内不会触发对服务器的请求。您可以通过keepHistory
选项调整时间段
因此,您将无法通过包获得反应性更改,并且它似乎不是适合您的情况的适当解决方案
您可以尝试通过订阅获取数据,并将搜索返回的数据映射到集合中的记录,但这似乎代价高昂
另外,请看,这表明其他人也遇到了相同类型的问题。Hi@masteram,非常感谢您的快速回复!我要去看看您的建议。听起来不错。我也想到了同样的问题,一个简单的快照。我认为这个包只是“半反应性的”?我是meteor的新手,但如果我的印象是……是的,反应部分是在查询更改时为您提供不同数据集的部分。
<!-- 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>