如何在meteor中干掉模板助手?

如何在meteor中干掉模板助手?,meteor,Meteor,我的模板助手有重复的代码: Template.foodMenu.helpers({ breakfast: function() { var breakfastItems = EatingTimes.find(// query for breakfast items); // function to sort breakfastItems in here (code duplication) }, lunch: function() { var lunchIte

我的模板助手有重复的代码:

Template.foodMenu.helpers({
  breakfast: function() {
    var breakfastItems = EatingTimes.find(// query for breakfast items);
    // function to sort breakfastItems in here (code duplication)
  },
  lunch: function() {
    var lunchItems = EatingTimes.find(// query for lunch items);
    // function to sort lunchItems in here (code duplication)
  },
  dinner: function() {
    var dinnerItems = EatingTimes.find(// query for dinner items);
    // function to sort breakfastItems in here (code duplication)
  }
);
Template.foodMenu.helpers({
  breakfast: function() {
    var breakfastItems = EatingTimes.find(// query for breakfast items);
    sortFoodItems(breakfastItems);
  },
  lunch: function() {
    var lunchItems = EatingTimes.find(// query for lunch items);
    sortFoodItems(lunchItems);
  },
  dinner: function() {
    var dinnerItems = EatingTimes.find(// query for dinner items);
    sortFoodItems(dinnerItems);
  }
);
我想把它擦干:

Template.foodMenu.helpers({
  breakfast: function() {
    var breakfastItems = EatingTimes.find(// query for breakfast items);
    // function to sort breakfastItems in here (code duplication)
  },
  lunch: function() {
    var lunchItems = EatingTimes.find(// query for lunch items);
    // function to sort lunchItems in here (code duplication)
  },
  dinner: function() {
    var dinnerItems = EatingTimes.find(// query for dinner items);
    // function to sort breakfastItems in here (code duplication)
  }
);
Template.foodMenu.helpers({
  breakfast: function() {
    var breakfastItems = EatingTimes.find(// query for breakfast items);
    sortFoodItems(breakfastItems);
  },
  lunch: function() {
    var lunchItems = EatingTimes.find(// query for lunch items);
    sortFoodItems(lunchItems);
  },
  dinner: function() {
    var dinnerItems = EatingTimes.find(// query for dinner items);
    sortFoodItems(dinnerItems);
  }
);
我应该将此函数放置在何处以便干燥?如何给它命名,以便正确地调用它?如果有区别的话,我使用的是熨斗路由器。

var sortFoodItems = function (foodItems) { 
  // code to sort out and return foodItems to particular method that calls it   
};

只需在同一文件中的helpers之前定义函数

var sortFoodItems = function (foodItems) { 
  // code to sort out and return foodItems to particular method that calls it   
};

Template.foodMenu.helpers({
  breakfast: function() {
    var breakfastItems = EatingTimes.find(/* query for breakfast items */);
    sortFoodItems(breakfastItems);
  },
  lunch: function() {
    var lunchItems = EatingTimes.find(/* query for lunch items */);
    sortFoodItems(lunchItems);
  },
  dinner: function() {
    var dinnerItems = EatingTimes.find(/* query for dinner items */);
    sortFoodItems(dinnerItems);
  }
});
如果要在多个文件中使用sortFoodItems函数,请创建名为lib的文件夹,并将该函数放在file functions.js中(不带var关键字),使其成为全局函数。例如:

//lib/functions.js
sortFoodItems = function (foodItems) { 
  // code to sort out and return foodItems to particular method that calls it   
};

您需要了解Meteor是如何读取项目目录的。阅读更多关于流星文档

您还可以使用
Template.registerHelper(名称、函数)
为此创建一个全局帮助程序,该帮助程序如下所示:

Template.registerHelper('menuItems', function(eatingTime, sortCriteria) {
  //do some checking of your arguments
  eatingTime = eatingTime || '/* your default eating time */';
  sortCriteria = sortCriteria || {/* your default sort criteria */};
  check(eatingTime, String);
  check(sortCriteria, Object);

  //find and sort your items in one mongo query or you could do separate find and sort if you want
  menuItems = EatingTimes.find({time: eatingTime}, sortCriteria);

  return menuItems; 
});
这将是使代码干涸的最快的方法

然后在模板中,您可以将其称为:

{{#each menuItems 'time args' 'sort arg'}}

只需将它与您的助手放在同一个文件中(在顶层)?