我正在努力了解如何在Meteor中重新发布。我有这个发布的"所有客户"数据,它最初在页面加载时加载,与当月的客户一起:
Meteor.publish("allCustomers", function () {
var pDate = moment().utc().toDate();
var dateFilter = GetWholeMonthFilterFromDate(pDate);
return Customers.find(dateFilter);
});
到目前为止一切都很好。我还有一种服务器方法,当用户选择与当前月份不同的月份时,它可以获得客户:
Meteor.methods({
allCustomers:function(pDate){
function GetWholeMonthFilterFromDate(pDate){
var firstDayOfMonth = new Date(pDate.getFullYear(), pDate.getMonth(), 1);
var lastDayOfMonth = new Date(pDate.getFullYear(), pDate.getMonth() + 1, 0);
var dateFilter =
{
"joined": {"$gte": firstDayOfMonth, "$lte": lastDayOfMonth}
};
return dateFilter;
}
var dateFilter = GetWholeMonthFilterFromDate(pDate);
return Customers.find(dateFilter).fetch();
},
我使用这样的"allCustomers"服务器方法:
Meteor.call("allCustomers", selectedDate, function(error, result){
if(error)
{
console.log('ERROR :', error);
return;
}
else
console.log(result);
});
我的问题是,当用户选择不同的日期时,我如何使用Meteor.call("allCustomers")的结果集来更新最初发布的"allCustomer"数据?这意味着,即使我在控制台中看到了新客户(当回调执行时),我的页面仍然使用最初发布时的旧数据。如何使用Meteor.call()的结果重新更新已发布的数据?
提前感谢
尝试重新订阅allCustomers
,这几乎不需要改进:
Meteor.publish("allCustomers", function (pDate) {
var dateFilter = GetWholeMonthFilterFromDate(pDate);
return Customers.find(dateFilter);
});
您的allCustomers
发布函数是通过添加参数pDate
来修改的,这比在内部创建pDate
要灵活得多。
在这种方法中,您可以停止订阅,并使用参数 记得更改 每次用户点击 显示此方法的示例pDate
再次订阅// UPDATED after @saimeunt comment
if (Meteor.isClient) {
Meteor.startup(function(){
Tracker.autorun(function(){
Meteor.subscribe('allCustomers',Session.get("selectedDate"));
})
// initial selection
Session.set("selectedDate",moment().utc().toDate());
})
}
Session.set("selectedDate", DATE_PARAM)
菜单模板中的日期:Template.tpl_name.events({
'click .month':function(e, tpl){
var DATE_PARAM = ... ;
Session.set("selectedDate", DATE_PARAM)
}
})
.month
按钮时,Session.get("selectedDate")
都会发生变化,这将导致重新订阅。