返回undefined的Meteor.js集合聚合不是一个函数

时间:2014-12-21 22:28:46

标签: meteor

我正在尝试在我的Meteor.js应用程序中进行集合聚合,如下所示,但每次我调用我的服务器logSummary方法时,我都会收到以下错误。有人可以告诉我我做错了什么/如何解决这个错误?感谢。

注意:我使用的是Meteor-aggregate

TypeError: undefined is not a function
    at Object.Template.detailedreport.helpers.myCollection (http://localhost:3000/client/views/report.js?

代码:

Template.detailedreport.rendered = function() {
     Session.set("dreport_customer", "");
     Session.set("dreport_project", "");
     Session.set("dreport_startDate", new Date());
     Session.set("dreport_endDate", new Date());

   $('.set-start-date').datetimepicker({
        pickTime: false,
        defaultDate: new Date()
   });
   $('.set-end-date').datetimepicker({
        pickTime: false,
        defaultDate: new Date()
   });  

  $('.set-start-date').on("dp.change",function (e) {
       Session.set("dreport_startDate", $('.set-start-date').data('DateTimePicker').getDate().toLocaleString());
    });
    $('.set-end-date').on("dp.change",function (e) {
        Session.set("dreport_endDate", $('.set-end-date').data('DateTimePicker').getDate().toLocaleString());
    });
};

Template.detailedreport.helpers({
    customerslist: function() {
       return Customers.find({}, {sort:{name: -1}});       
    },
    projectslist: function() { 
       return Projects.find({customerid: Session.get("dreport_customer")}, {sort:{title: -1}});       
    },
    myCollection: function () {
      var now  = Session.get("dreport_startDate");
      var then = Session.get("dreport_endDate");
      var custID = Session.get("dreport_customer");
      var projID = Session.get("dreport_project");
          Meteor.call('logSummary', now, then, projID, custID, function(error, data){
            if(error)
              return alert(error.reason);
            return data;
          });        

    },      
    settings: function () {
        return {
            rowsPerPage: 10,
            showFilter: true,
            showColumnToggles: false,
            fields: [
                { key: '0._id.day', label: 'Day' },
                { key: '0.totalhours', label: 'Hours Spent'}                           
            ]
        };
    }

});

Template.detailedreport.events({
   'submit form': function(e) {
      e.preventDefault();

  Session.set('dreport_endDate', $('.set-end-date').data('DateTimePicker').getDate().toLocaleString());
  Session.set('dreport_startDate', $('.set-start-date').data('DateTimePicker').getDate().toLocaleString());
  Session.set('dreport_project', $(e.target).find('[name=project]').val());
  Session.set('dreport_customer', $(e.target).find('[name=customer]').val());      

   },  
   'change #customer': function(e){
        Session.set("dreport_project", "");
    Session.set("dreport_customer", e.currentTarget.value);
   },
   'change #project': function(e){
    Session.set("dreport_project", e.currentTarget.value);
   }  
});



Template:

    <div>
      {{> reactiveTable class="table table-bordered table-hover" collection=myCollection settings=settings}}
    </div>




Server:

Meteor.methods({
  logSummary: function(startDate, endDate, projid, custid){
    var pipeline = [
      { $match: { date: { $gte: new Date(startDate), $lte: new Date(endDate) },
                  projectid: projid,
                  customerid: custid
                } 
      },
      { $group: {
            _id: { 
                "projectid": "$projectid",
                "day": { "$dayOfMonth": "$date" },
                "month": { "$month": "$date" },
                "year": { "$year": "$date" }
            },
            totalhours: {"$sum": "$hours"}
       }}
    ];
    return ProjectLog.aggregate(pipeline);;
  }
});

1 个答案:

答案 0 :(得分:3)

查看ReactiveTable文档,看起来您需要执行以下操作:

Template.myTemplate.helpers({
    myCollection: function () {
        return myCollection;
    }
});

其中myCollection是您定义的Mongo / Meteor集合(例如BlogPosts)的名称,例如: BlogPosts = new Mongo.Collection('blogPosts');

您获得undefined is not a function的原因是您在模板助手中调用了Meteor方法。该调用是异步,因此返回值为undefined。现在您将undefined传递给ReactiveTable。 ReactiveTable会尝试调用类似myCollection.find()的内容undefined.find(),因此会抛出您正在看到的错误。

稍后Meteor调用将完成,data值将丢失,因为该函数已经返回。

您可以在onCreated函数中调用Meteor.call,如下所示:

Template.myTemplate.onCreated(function () {
    Meteor.call('myFunction', 'my', 'params', function (err, result) {
        if (err) { 
            // do something about the error
        } else {
            Session.set('myData',result);
        }
    });
});

Template.myTemplate.helpers({
    myData: function () {
        Session.get('myData')
    }
});

然而,这无法解决ReactiveTable的问题。

如果您尝试显示的集合仅用于此单个页面,则可以将聚合放在发布功能中,以便minimongo仅包含 与聚合匹配的文档以及正确的文档将显示在您的ReactiveTable中。