meteor:设计模式:为集合的每个字段(列)创建模板助手

时间:2014-04-24 09:32:08

标签: javascript design-patterns meteor

使用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;
}

(使用变量仍然需要多个数据库查询,对吗?)

我应该使用一些设计模式来迭代文档的字段并自动创建模板助手吗?

我可以通过其他方式消除意大利面条代码?

1 个答案:

答案 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