使用Meteor Search-Source包获得结果的反应性问题

时间:2015-12-24 11:45:03

标签: javascript search meteor meteor-blaze meteor-helper

我正在使用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>

一些建议??非常感谢提前!

1 个答案:

答案 0 :(得分:2)

返回的数据记录本身不是被动的,因为数据是使用方法调用(search.source)在内部获取的。

您可以获得搜索时的数据快照。

此外,默认情况下会缓存数据,因此对同一术语的后续搜索不会在一段时间内触发对服务器的请求。您可以通过keepHistory选项调整时间段。

因此,您不会通过软件包获得被动更改,这似乎不适合您的情况。

您可以尝试通过订阅获取数据,并将搜索返回的数据映射到您的集合中的记录,但这似乎很昂贵。

此外,请参阅this issue,其中显示其他人遇到过相同类型的问题。