如何在传递给模板之前格式化Collection.find的结果

时间:2014-03-15 07:12:55

标签: mongodb meteor handlebars.js

HTML:

    <div class="leaderboard">
        {{#each players}}
          {{> player}}
        {{/each}}
    </div>
    <template name="player">
      <div class="player {{selected}}">
        <span class="name">{{name}}</span>
        <span class="score">{{score}}</span>
        <span class="joindate">{{joindate}}</span>
      </div>
    </template>

JS:

Players = new Meteor.Collection("players");
if (Meteor.isClient) {
  Template.players = function () {
    return Players.find();
  };
}
if (Meteor.isServer) {
  Meteor.startup(function () {
    if (Players.find().count() === 0) {
      var names = ["Ada Lovelace",
                   "Grace Hopper",
                   "Marie Curie",
                   "Carl Friedrich Gauss",
                   "Nikola Tesla",
                   "Claude Shannon"];
      for (var i = 0; i < names.length; i++)
        Players.insert({name: names[i], 
                       score: Math.floor(Random.fraction()*10)*5,
                       joindate: new Date().getTime()
                     });
    }
  });
}

从上面的示例中,我将joindate存储为unix时间戳。在返回Template.players函数之前,如何将连接日期变量格式化为Collection.find结果中的可读日期。

我知道我可以在insert命令中格式化日期,但我的问题是如何在传递给模板之前操作/格式化collection.find中的数据。

1 个答案:

答案 0 :(得分:2)

您可以在创建Collection时传递transform function

var Players = new Meteor.collection('players', { 
    transform: function(doc) { 
        doc.joindateStr = (new Date().getTime()).toString(); 
        return doc;
    }
});

然后在模板中使用joindateStr。或者您可以将joindate本身覆盖为Date对象。

transform函数将应用于findfindOne返回的所有文档。它也可以在第二个参数传递给find或findOne`明确地传递。