数组对象命名空间流星

时间:2015-06-29 09:30:07

标签: arrays node.js meteor namespaces

似乎我无法为命名空间显示数组

 {{#each reports}}
    {{_id}}
 {{/each}}

我的代码看起来像这样

服务器方法。

reports : function(){
      var pipeline = [
        {$group:{_id: "$activity.destination.name","count":{$sum:1 } } },
        {$match:{_id:{$ne:null} }}];    

    var result = Reports.aggregate(pipeline);
    console.log(result);
  return result;

来自助手

reports: function(){      
        Meteor.call("reports",function(err, data) {
          arr =[];
          data.forEach(function(doc){
            arr.push(doc);
          });
          console.log(arr);
         return arr;
         });              
    }

在浏览器控制台中,响应如下所示

[Object]
 0:Object
 _id: "Balance Sheet and P&L Rates - Current Year"
 count: 2 ..etc

我不确定它的名称空间是否是非游标的对象数组。但它并没有给我一个错误。我不确定我做的是否正确。

1 个答案:

答案 0 :(得分:1)

Meteor.call立即返回,一旦数据从服务器返回,就会调用回调。

您的模板正在引用一个帮助程序,而该帮助程序又调用服务器方法,然后立即返回什么都没有。返回时,帮助程序的回调无法将数据返回到模板。

在你的情况下你应该:

  1. 为报告创建一个集合。

  2. 在访问相关页面时订阅报告集(如果您正在使用Iron Router,这通常是从路由控制器完成的。

  3. 创建发布功能以将报告发布到集合。

  4. 最后一点并不像往常一样直截了当,因为你正在聚合结果,但是仍然可以使用这样的东西(未经测试):

    Meteor.publish('reports', function(options) {
    
        var sub = this;
    
        var pipeline = [
            {$group:{_id: "$activity.destination.name","count":{$sum:1 } } },
            {$match:{_id:{$ne:null} }}];    
    
        var result = Reports.aggregate(pipeline);
        var arrayLength = reports.length;
        for (var i = 0; i < arrayLength; i++) {
            var report = reports[i];
            sub.added('reports', report._id, report);
        }
    })
    

    然后,您只需从帮助者调用Reports集合中的find

    reports: function() {      
        return Reports.find()       
    }
    

    或者将相同的光标作为数据上下文的一部分返回到Iron Router控制器中,并直接在模板中使用结果。