Это официально не отвечает на вопрос, но я хотел бы поделиться простой техникой, которая практически решает большинство проблем, которые вы описали.
Предположим, у нас есть группа помощников, с которой мы хотим иметь доступ из разных частей вашего приложения как из шаблонов, так и непосредственно из нашего кода javascript. Для этого у меня был бы глобальный объект Helpers
, к которому я мог бы добавить столько функций, сколько захочу, например.
Helpers.routeIs = function (name) {
var current = Router.current();
return current && current.route && current.route.getName() === name;
};
Helpers.year = function() {
return moment().year();
};
Это делает их легко доступными по всему коду и довольно легко проверить. Но я также хочу использовать их в своих шаблонах Spacebars, не так ли?
Простая идея - создать единый глобальный помощник, который вернет объект Helpers
.
Template.registerHelper('$', function() {
return Helpers;
});
Хорошая вещь о том, что он будет обеспечивать меня префикс каждую ссылку на мой «глобальный помощник» с $
, т.е. {{$.year}}
или {{$.routeIs 'home'}}
, что делает код намного более удобным для чтения.
К сожалению, есть небольшая проблема с этим решением. Рассмотрим следующий пример:
Helpers.fullName = function() {
return this.firstName + ' ' + this.lastName;
};
Проблема заключается в том, что если мой помощник собирается получить доступ к текущему контексту через this
, он получит сам Helpers
объект, а не контекст данных, поэтому {{$.fullName}}
никогда не будет работать должным образом. Но, конечно, есть обходной путь для этого:
Template.registerHelper('$', function() {
return new Proxy(this);
});
function Proxy (context) {
this.context = context;
}
// put this in a place when you're quite sure
// all the helpers are already defined
_.each(Helpers, function (helper, name) {
Proxy.prototype[name] = function() {
return helper.apply(this.context, arguments);
};
});
EDIT
Я добавил эталонную реализацию здесь:
https://github.com/anticoders/meteor-helpers
Пожалуйста, обратите внимание на: https: // GitHub .com/антикодеры/метеорные помощники –