正在更新Meteor中已发布的集合

Updating already published collection in Meteor

本文关键字:集合 更新 Meteor      更新时间:2023-09-26

我正在努力了解如何在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")都会发生变化,这将导致重新订阅。

显示此方法的示例