Meteor-简单的搜索问题

Meteor - Simple Search Issues

本文关键字:问题 搜索 简单 Meteor-      更新时间:2023-09-26

所以我试图在Meteor中实时搜索一些客户端信息。

我有

Template.userTable.events({
    "change #nameSearchBar":function(event){
        //console.log(event);
        searchText = event.target.value;
        filteredUsers = Meteor.users.find({"profile.name":{$regex: (".*"+searchText+".*") } });
        console.log(filteredUsers.fetch());
    }
});

在我的js和中

Template.userTable.helpers({
        usersOnline: function() {
            return filteredUsers;
        }
});

同样。我可以看到filteredUsers在控制台日志中得到了更新,但我没有得到列出usersOnline的html的实时更新——相反,我只是通过调用filteredUsers=Meteor.users.find().来获得所有这些用户,这就是usersOnline初始化的目的

如何获得所需的实时更新?

您的filteredUsers变量不是反应性的,因此当它发生更改时,没有任何内容告诉usersOnline助手重新运行。我认为你可以用两种方法之一:

  1. 使用ReactiveVar。无可否认,我对它们没有太多经验,但我认为你可以将ReactiveVar分配为模板的一部分,然后让它观察——类似于:

    Template.userTable.created = function() { 
      this.data.filteredUsers = new ReactiveVar(...) // initialize this to whatever
    }
    Template.userTable.helpers({
        usersOnline: function() {
            return this.filteredUsers.get(); // pulling from the reactive var rather than a static var
        }
    });
    Template.userTable.events({
      "change #nameSearchBar":function(event){
        searchText = event.target.value;
        // Setting the reactive var should invalidate the "get" in the helper and trigger re-run
        filteredUsers.set(Meteor.users.find({"profile.name":{$regex: (".*"+searchText+".*") } })); 
      }
    });
    
  2. 使用Session变量——非常相似,但它可以全局访问,而不是在该Template上设置。默认情况下,所有会话变量都是被动的:

    Template.userTable.created = function() { 
      Session.setDefault('filteredUsers', ...) // initialize this to whatever
    }
    Template.userTable.destroyed = function() { 
      Session.set('filteredUsers', null); // clean up after yourself when you navigate away
    }
    Template.userTable.helpers({
        usersOnline: function() {
          return Session.get('filteredUsers'); // pulling from Session var, which is reactive
        }
    });
    Template.userTable.events({
      "change #nameSearchBar":function(event){
        searchText = event.target.value;
        // Setting the Session var should invalidate the "get" in the helper and trigger re-run
        Session.set('filteredUsers', Meteor.users.find({"profile.name":{$regex: (".*"+searchText+".*") } }));           }
    });
    

正如我所说,我在ReactiveVars方面做得不多,但我认为从技术上讲,#1是更好的选择,所以我会先考虑一下。

您还可以在Session变量中定义搜索文本,当该变量发生变化时,显示新结果。

类似这样的东西:

Session.setDefault('searchText', null);
Template.userTable.events({
   "change #nameSearchBar":function(event){;
       searchText = event.target.value;
       Session.set('searchText', searchText);
   } 
});
Template.userTable.helpers({
    usersOnline: function() {
        if(Session.get('searchText') == null){
            return Meteor.users.find();
        } else {
             var searchText = Session.get('searchText');
             return Meteor.users.find({"profile.name":{$regex: (".*"+searchText+".*") } });
        }
    }
});