更新Meteor中已发布的集合

时间:2014-09-14 19:21:26

标签: javascript meteor

我试图了解如何在Meteor中重新发布。我已经发布了#34; allCustomers"最初在页面加载时加载的数据,来自当月的客户:

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()的结果重新更新已发布的数据?

提前致谢

1 个答案:

答案 0 :(得分:2)

尝试重新订阅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")都会被更改,这将导致重新订阅。

Example showing this approach