[英]Passing variables into Meteor helpers
我正在努力解決與變量聲明有關的非常基本的問題。 我已經閱讀了所有可以在變量上找到的內容,但是我不知道我的問題是否與1)我如何聲明變量或2)如何設置變量的范圍有關。
首先,我對Meteor中的變量的理解是,如果我使用var
,那么我將設置文件作用域,這將使該變量可用於該特定模板的每個助手。 如果我不使用var
,它將是全局的,因此每個模板中的助手都可以使用。 那是對的嗎?
以下代碼塊可以正常工作,並在客戶端中返回正確的值:
Template.CompanyFinancials.helpers({
priceEarningsFy1: function () {
var compTicker = this.ticker
var price = Companies.findOne({ticker: compTicker}).capTable.lastClose;
var epsFy1 = Companies.findOne({ticker: compTicker}).fy1.eps;
return (price / epsFy1).toFixed(1)
});
在這個應用程序中,我有數十種類似的計算方法,其中許多依賴於比本示例更多的變量,因此,我一直試圖將這些變量分解出來,並在模板中重用它們,如下所示:
var compTicker = function() {
return this.ticker;
};
console.log(compTicker);
var price = function(compTicker) {
Companies.findOne({ticker: compTicker}).capTable.lastClose;
};
console.log(price);
var epsFy1 = function(compTicker) {
Companies.findOne({ticker: compTicker}).fy1.eps;
};
console.log(epsFy1);
Template.CompanyFinancials.helpers({
priceEarningsFy1: function (price, epsFy1) {
return (price / epsFy1).toFixed(1)
}
});
使用此代碼,console.log()實際上為每個變量而不是值return this.ticker
每個函數內的文本(例如, return this.ticker
)。 如果我聲明的變量沒有函數,就像我在助手中所做的那樣,它將為compTicker
返回undefined。
我試圖遵循這個解釋可重復使用代碼的答案 ,但是不清楚是否適用相同的用例。 我的變量指向數據庫中的特定字段,而不一定指向計算。
誰能幫我修復我的語法? 就目前的理解而言,我編寫的代碼要多於所需的倍數。 謝謝。
編輯我也嘗試過用在幫助器中聲明變量的方式聲明變量,但是這些變量返回undefined
。
var compTicker = this.ticker;
console.log(compTicker);
var price = CompaniesFeed.findOne({ticker: this.ticker}).capTable.lastClose;
console.log(price);
var epsFy1 = CompaniesFeed.findOne({ticker: this.ticker}).fy1.eps;
console.log(epsFy1);
解決方案:使用全局幫助器並返回多個值,然后使用點表示法訪問模板HTML:
Template.registerHelper('priceEarnings',function(){
var ticker = this.ticker;
var company = CompaniesFeed.findOne({ticker: ticker});
return {
peFy1: (company.capTable.lastClose / company.financial.fy1.eps).toFixed(1),
peFy2: (company.capTable.lastClose / company.financial.fy2.eps).toFixed(1)
};
});
<td>{{priceEarnings.peFy1}}x</td>
您可能正在尋找全球性的幫手 。 這些是可以在所有模板中重復使用的助手。
以您的priceEarningsFy1
函數為例:
Template.registerHelper('priceEarningsFy1',ticker => {
const company = Companies.findOne({ticker: ticker});
return ( company.capTable.lastClose / company.fy1.eps ).toFixed(1);
});
在這種情況下,我已指定將ticker
作為參數提供。 例如,在{{priceEarningsFy1 this.ticker}}
模板中,您可以使用{{priceEarningsFy1 this.ticker}}
。 要從js代碼引用此函數,請使用UI._globalHelpers.priceEarningsFy1(ticker)
請注意,您在給定文件內定義的任何本地函數都可用於同一文件內的任何其他函數。 我的模式是將所有全局助手放在一個按名稱排序的文件中,然后在底部添加各種實用程序函數供全局助手使用。 這使東西相對脫水。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.