1

我在显示交易列表的页面上使用流星。交易文件如下所示:

{ payer: 'username1', payee: 'username2', amount: 100, date: someDate }

要显示这样的交易列表:

<ul class="recent-transactions"> {{#each transactions}} <li>{{this.amount}} to {{this.payee}} from {{this.payer}}</li> {{/each}} </ul>

在帮助程序中,或者在以某种方式呈现模板之前,我想用我可以获得的实际用户文档替换payeeand属性,以便模板看起来像这样:payerMeteor.users.findOne({ username: someUsername})

<ul class="recent-transactions"> {{#each transactions}} <li>{{this.amount}} to {{this.payee.profile.FirstName}} from {{this.payer.profile.FirstName}}</li> {{/each}} </ul>

有没有办法做到这一点?

4

2 回答 2

1

您还可以使用转换函数(请参阅转换下的http://docs.meteor.com/#collections

Template.hello.transactions = function(){
    return Transactions.find({}, {transform: function(doc) {
        var payee = Meteor.users.findOne({username: doc.payee});
        var payer = Meteor.users.findOne({username: doc.payer});
        doc.payer_FirstName = payeer.profile.FirstName;
        doc.payee_FirstName = payee.profile.FirstName;

        return doc;
        }
    });
}

转换函数可以让您在文档返回之前更改它,所有现有字段都保留,并且现在都添加payee_FirstName& payer_FirstName,就好像它们是集合的一部分一样。

在上面的例子中,我使用了Meteor.users. 确保所有用户的详细信息都以安全的方式发布。默认情况下,我认为流星隐藏除了登录用户之外的所有内容。

因此,您可以将其解析为不同的集合。在这种情况下,payer/payee记录与usernamein匹配Meteor.users。因此,您可以提取收款人/付款人的详细信息,而无需将所有详细信息存储在Transactions.

于 2013-05-23T21:11:27.810 回答
0

我会将事务转换为返回正确数据的函数。把手的要点是它应该是“无逻辑”的,因此您应该从实际模板中抽象出任何处理。

我会通过为助手创建一个函数来做到这一点,如下所示:

Template.transactionTemplate.transactions = function(){
  recentTransactions = [];
  Transcationscollection.find({/* your query */}).forEach(function(transaction){
    recentTransactions.push({
      "amount"              : transaction.amount,
      "payeeFirstName"      : payee.findOne(/* do something with transaction.payee */).profile.FirstName,
      "payerFirstName"      : payer.findOne(/* do something wtih transaction.payer */).profile.FirstName
    });
  });

  /* Personally I convert it to json to display in handlebars... not sure if you have to its just how I do it. */
  return EJSON.stringify(recentTransactions);
};
于 2013-05-23T19:54:40.903 回答