使用meteor js, 我注意到如果我有这样的文件
{"q1":"someValue1","q2":"someValue2","q3":"someValue3","q4":"someValue4"}
Template.whatever.helpers({
gimmeResults1: function(){return myCollection.find({},{fields:{"q1":1}})},
gimmeResults2: function(){return myCollection.find({},{fields:{"q2":1}})}
});
以非常丑陋的方式平均一个字段,例如
q1Avg: function () {
var count = myCollection.find({},{fields:{"q1":1}}).count();
var total = 0;
myCollection.find({},{fields:{"q1":1}}).map(function(doc) {
total += doc.q1;
});
return avg = (Math.round((total / count)*100))/100;
}
(使用变量仍然需要多个数据库查询,对吗?)
我应该使用一些设计模式来迭代文档的字段并自动创建模板助手吗?
我可以通过其他方式消除意大利面条代码?
答案 0 :(得分:0)
第一步可能如下所示:
getField = function(collection, field) {
var projection = {};
projection[field] = 1;
return collection.find({}, {fields: projection});
}
UI.registerHelper("getField", getField);
您可以在{{getField myCollection "q1"}}
等模板中调用,以及返回myCollection
的帮助程序。你可以更进一步:
var makeFieldGetter = function(collection, field) {
return function() {
return getField(collection, field);
};
};
Template.whatever.helpers({
gimmeResults1: makeFieldGetter(myCollection, "q1")
gimmeResults2: makeFieldGetter(myCollection, "q2")
});
甚至更进一步:
var makeFieldGetters = function(collection, fields) {
var obj = {};
fields.forEach(function(field) {
obj["gimme_" + field] = makeFieldGetter(collection, field);
});
return obj;
};
Template.whatever.helpers(makeFieldGetters(myCollection, ["q1", "q2"]));
// creates helpers gimme_q1, gimme_q2