所以我正试图在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()。
如何获得所需的实时更新?
答案 0 :(得分:2)
您的filteredUsers
变量不是被动的,所以当它变化时,没有任何东西告诉usersOnline
助手重新运行。我认为你可以通过以下两种方式之一来做到这一点:
使用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+".*") } }));
}
});
使用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+".*") } })); }
});
就像我说的那样,我没有对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+".*") } });
}
}
});