流星 - 简单的搜索问题

时间:2015-03-20 18:32:52

标签: javascript meteor

所以我正试图在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来获取所有这些,这是usersOnline初始化的内容。 = Meteor.users.find()。

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

2 个答案:

答案 0 :(得分:2)

您的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 variable - 非常相似,但可以全局访问,而不是在该模板上设置。默认情况下,所有会话变量都是被动的:

    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+".*") } }));           }
    });
    
  3. 就像我说的那样,我没有对ReactiveVars做过很多,但我认为#1在技术上是更好的方式,所以我先玩弄它。

答案 1 :(得分:0)

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

这样的事情:

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+".*") } });
        }
    }
});