在onBefore钩子或类似钩子中更改返回的集合

时间:2017-08-23 13:11:25

标签: meteor iron-router

是否可以在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"
});

2 个答案:

答案 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});
    }
});

这样,代码非常简单,易于维护。