2014-12-07 3 views
1

Моего помощник Шаблон имеет дублированный код:Как высушить шаблоны Помощники в метеор?

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); 
    } 
); 

Где разместить эту функцию, так что я могу высыхаю? Как мне назвать пространство так, чтобы я мог правильно его назвать? Я использую Iron Router, если это имеет значение.

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

Просто поместите его в тот же файл (на верхнем уровне), как ваши помощники? –

ответ

1

Просто определить вы действуете, прежде хелперов в том же файле

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 и поместить функцию в functions.js файлов без ключевого слова var, чтобы сделать его глобальным. Например:

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

Вам необходимо понять, как Meteor считывает ваши проектные каталоги. Подробнее о structuring your application в документах Meteor.

1

Вы также можете создать глобальную помощника для этого, используя Template.registerHelper(name, function), который будет выглядеть так:

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'}} 
Смежные вопросы