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) {
我通过发布和订阅编写了一个简单的搜索,我可以看到搜索结果在服务器和客户端都正确显示 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) {