2017-08-23 73 views
0

是否可以在onBeforeAction或類似鉤子中更改(爲每個記錄添加更多字段)返回的集合?在onBefore鉤子或類似鉤子中更改返回的集合

我有InvoiceHistory集合,我通過分頁。我還想在每張發票中顯示公司名稱,公司地址,電子郵件地址和增值稅登記號碼 - 這四個字段存儲在另一個收藏中。所以我想將這四個字段添加到從InvoiceHistory返回的每個記錄中。如果還有其他方法可以做到這一點,我樂於接受建議。當您導航/瀏覽/翻頁到第二頁時,我正在使用Alethes meteor分頁,它丟失了itemTemplate中返回的幫助字段。 Alethes分頁還依賴於鐵路由器,是否有可能通過鐵路路由器實現我想要的功能

===================== ================================================== =

@Sean。謝謝。下面是使用流星發佈複合代碼:

if (Meteor.isServer) { 
 

 
\t import { publishComposite } from 'meteor/reywood:publish-composite'; 
 

 
\t publishComposite('invoicesWithCompanyDetails', function(userId, startingDate,endingDate) { 
 
\t \t return { 
 
\t \t \t find() { 
 
\t \t \t \t // Find purchase history for userId and the two dates that were entered. Note arguments for callback function 
 
\t \t \t \t // being used in query. 
 
\t \t \t \t return PurchaseHistory.find({Id:userId,transactionDate:{$gte:new Date(decodeURIComponent(startingDate)), 
 
\t \t \t \t \t $lt:new Date(decodeURIComponent(endingDate))}}); 
 
\t \t \t }, 
 
\t \t \t children: [ 
 
\t \t \t \t { 
 
\t \t \t 
 
\t \t \t \t \t find() { 
 
\t \t \t \t \t \t return CompanySharedNumbers.find(
 
\t \t \t \t \t \t \t { _id:"firstOccurrence" }, 
 
\t \t \t \t \t \t \t { fields: { companyName: 1, companyAddress: 1 } } 
 
\t \t \t \t \t \t); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t ] 
 
\t \t } 
 
\t }); 
 
}

Router.route('/store/invoices/:_username/:startingDate/:endingDate', { //:_startingDate/:_endingDate 
 
\t name: 'invoices', 
 
\t template: 'invoices', 
 
\t onBeforeAction: function() 
 
\t { 
 
\t \t ... 
 
\t }, 
 
\t waitOn: function() { 
 
\t \t var startingDate = this.params.startingDate; 
 
\t \t var endingDate = this.params.endingDate; 
 
\t \t return [Meteor.subscribe('systemInfo'),Meteor.subscribe('testingOn'),Meteor.subscribe('invoicesWithCompanyDetails',startingDate,endingDate)]; 
 
\t } 
 
});

Pages = new Meteor.Pagination(PurchaseHistory, { 
 
\t itemTemplate: "invoice", 
 
\t availableSettings: {filters: true}, 
 
\t filters: {}, 
 
\t route: "/store/invoices/:_username/:startingDate/:endingDate/", 
 
\t router: "iron-router", 
 
\t routerTemplate: "invoices", 
 
\t routerLayout: "main", 
 
\t sort: { 
 
\t \t transactionDate: 1 
 
\t }, 
 
\t perPage: 1, 
 
\t templateName: "invoices", 
 
\t homeRoute:"home" 
 
});

+0

看看集合轉換https://docs.meteor.com/api/collections.html也,你可能更喜歡denormalizing ... – Salketer

+0

我看了看轉換;整潔,但你如何將它應用到alethes分頁集合?反規範化肯定會起作用,但是我正在構建的應用程序已經需要大量空間,我正在儘可能地提高效率。 –

回答

0

而不是將新字段添加到您的所有文檔。你可以做的是增加一個助手來加載一份公司文件:

Template.OneInvoice.helpers({ 
    loadCompany(companyId){ 
     return Company.findOne({_id: companyId}); 
    } 
}); 

而在你的模板代碼使用它:

<template name="OneInvoice"> 
    <p>Invoice id: {{invoice._id}}</p> 
    <p>Invoice total: {{invoice.total}}</p> 
    {{#let company=(loadCompany invoice.companyId)}} 
     <p>Company name: {{company.name}}</p> 
     <p>Company business address: {{company.businessAddress}}</p> 
    {{/let}} 
</template> 

這樣,代碼很簡單,易於維護。

+0

我已經嘗試了你的建議。看到我上面的評論:「我使用Alethes流星分頁,當你導航/瀏覽/頁面到第二頁時,失去了itemTemplate中返回的幫助字段」如果我需要它在一頁上,這將是一個很好的解決方案。儘管謝謝你的回答。 –

+0

我甚至在重新查看代碼後給出了let語句。它只顯示在第一頁上,就像我以前一樣。對不起,再次感謝。 –

+1

**所以爲了避免重複已經寫在這個頁面上的內容,@Gaetan在這裏部分是正確的。唯一缺少的是,包含公司詳細信息的集合的訂閱不能位於特定的鐵路由器路由上,而是全局的**所以在我的情況下,Meteor.subscribe('companyAddressNameEmailAndVatNumber')必須是全局的 –

0

如果我正確理解你,這聽起來像是一個composite publication的工作。

使用複合發佈,您可以同時返回多個集合中的相關數據。

因此,您可以找到所有發票,然後使用存儲在發票對象中的公司ID,可以同時從公司集合中返回公司名稱和其他信息。

我以前使用過複合出版物來處理複雜的數據結構,並且它們完美地工作。

希望有幫助

+0

看起來可能會有效。我會嘗試並讓你知道。我想鼓勵其他人提出建議,這就是爲什麼我沒有早點評論的原因 –

+0

哦,順便其他人你的建議仍然歡迎 –

+0

我試過你的建議。這些頁面不顯示公司的詳細信息。請參閱我的代碼 –