Reactive Template 在搜索后重新渲染 meteor js

Reactive Template re-render meteor js after search

我通过发布和订阅编写了一个简单的搜索,我可以看到搜索结果在服务器和客户端都正确显示 console.log,但是我的模板似乎没有重新呈现自己,尽管具有跟踪器依赖性。以下是客户端、发布和模板 onRendered 调用的代码。

客户代码

Template.list_customers.onRendered(function(event){
  console.log('Inside Rendered');
  Template.list_customers.__helpers[" getMyCustomers"]();
  //eventsUI.changed();
  eventsUI.changed();
});

Template.list_customers.helpers({
  getMyCustomers: function(searchTerm) {
    console.log('Search Term is ', searchTerm);

    // //Get the current user and its BP Id
      Meteor.subscribe("getUser", Meteor.userId());
      currentUser = Meteor.users.find({
        _id: Meteor.userId()
      }).fetch();

      currentUserBPId = currentUser[0].profile.BusinessPartnerId;
      //Get all the BP's which the logged in BP sells to

      Meteor.subscribe("getCustomerRelations", currentUserBPId);
      customer_cursor = BusinessPartnerRelations.find({
        "bp_subject": currentUserBPId,
        "relation": "sells_to"
      }).fetch();

      bp_predicates = customer_cursor.map(function(c) {
        return c.bp_predicate[0]
      });

      Deps.autorun(function() {
        handlePagination = Meteor.subscribeWithPagination("getCustomers", bp_predicates, 25,searchTerm);
      });

        if(searchTerm){
          console.log(searchTerm);
          customers = BusinessPartners.find({
            score:{"$exists":true}
          }).fetch();

        }
        else {
          customers = BusinessPartners.find({
            _id: { $in: bp_predicates }
          }, {
            sort: {
              name
            }
          }).fetch();
        }

        console.log(customers);
        return customers;
  }

Template.list_customers.events({
  'click #btnSearch': function(event) {
    searchTerm = $('#customerSearch').val();
    Template.list_customers.__helpers[" getMyCustomers"](searchTerm);
    //eventsUI.changed();
  }
});

服务器代码

Meteor.publish("getCustomers",function(customerIds,limit,searchTerm){
  if(!searchTerm){
    return BusinessPartners.find({
      _id:{$in:customerIds}
    },{limit:limit});
    this.ready();
  }
  else{
    customers = BusinessPartners.find({
      _id:{$in:customerIds},
      $text:{$search:searchTerm}
    },
    {fields:{score:{$meta:"textScore"}},
     sort:{score:{$meta:"textScore"}}
    },
    {limit:limit});
    console.log('Server side ', customers.fetch(), customers.count());
    return customers;
    this.ready();
  }
});

percolate:paginated-subscription documentation 中所述:

The paginated subscription expects you to have a publication setup, as normal, which expects as a final argument the current number of documents to display

这里的重点是"final"。因此,您的发布函数应该将 limit 作为最后一个参数, 而不是 第二个:

Meteor.publish("getCustomers",function(customerIds,searchTerm,limit) {