是否可以在onBeforeAction或类似的钩子中更改(为每个记录添加更多字段)返回的集合?
我有InvoiceHistory集合,我正在分页。我还想在每张发票中显示公司名称,公司地址,电子邮件地址和增值税登记号码 - 这四个字段存储在另一个集合中。所以我想将这四个字段添加到InvoiceHistory返回的每个记录中。如果还有其他办法,我愿意接受建议。我正在使用Alethes meteor pagination,当您导航/浏览/页面到第二页时,它会丢失其itemTemplate中返回的辅助字段。 Alethes分页也依赖于铁路由器,是否有可能在铁路由器的帮助下实现我想要的东西
=============================================== =========================
@Sean。谢谢。下面是使用meteor publish composite的代码:
if (Meteor.isServer) {
import { publishComposite } from 'meteor/reywood:publish-composite';
publishComposite('invoicesWithCompanyDetails', function(userId, startingDate,endingDate) {
return {
find() {
// Find purchase history for userId and the two dates that were entered. Note arguments for callback function
// being used in query.
return PurchaseHistory.find({Id:userId,transactionDate:{$gte:new Date(decodeURIComponent(startingDate)),
$lt:new Date(decodeURIComponent(endingDate))}});
},
children: [
{
find() {
return CompanySharedNumbers.find(
{ _id:"firstOccurrence" },
{ fields: { companyName: 1, companyAddress: 1 } }
);
}
}
]
}
});
}
Router.route('/store/invoices/:_username/:startingDate/:endingDate', { //:_startingDate/:_endingDate
name: 'invoices',
template: 'invoices',
onBeforeAction: function()
{
...
},
waitOn: function() {
var startingDate = this.params.startingDate;
var endingDate = this.params.endingDate;
return [Meteor.subscribe('systemInfo'),Meteor.subscribe('testingOn'),Meteor.subscribe('invoicesWithCompanyDetails',startingDate,endingDate)];
}
});
Pages = new Meteor.Pagination(PurchaseHistory, {
itemTemplate: "invoice",
availableSettings: {filters: true},
filters: {},
route: "/store/invoices/:_username/:startingDate/:endingDate/",
router: "iron-router",
routerTemplate: "invoices",
routerLayout: "main",
sort: {
transactionDate: 1
},
perPage: 1,
templateName: "invoices",
homeRoute:"home"
});
答案 0 :(得分:0)
如果我理解正确,这听起来像是composite publication的工作。
使用复合出版物,您可以同时从多个集合中返回相关数据。
因此,您可以找到所有发票,然后使用发票对象中存储的公司ID,您可以同时从公司集合中返回公司名称和其他信息。
我之前使用复合出版物来处理复杂的数据结构,并且它们运行得很好。
希望有所帮助
答案 1 :(得分:0)
而不是为您的所有文档添加新字段。您可以做的是添加一个帮助程序来加载公司文档:
import time
timeout = time.time() + 2
dot, i = ".", 0
while timeout > time.time():
print ("Loading" + dot*i, end = "\r")
time.sleep (0.1)
if i == 3:
i = 0
else:
i += 1
并在模板代码中使用它:
Template.OneInvoice.helpers({
loadCompany(companyId){
return Company.findOne({_id: companyId});
}
});
这样,代码非常简单,易于维护。