2015-08-17 5 views
4

Я определил помощник шаблона в Метеоре, скажуКак вы называете помощника шаблона Meteor с консоли или другого JS-кода?

Template.postsList.helpers({ 
    filteredPosts: function getPosts() { 
    return Posts.find(...); 
    } 
}); 

Как я могу отладить этот шаблон помощник из консоли, и как я могу использовать его из другого кода в приложении?

+0

Пожалуйста, обратите внимание на: https: // GitHub .com/антикодеры/метеорные помощники –

ответ

5
  1. Желая позвонить помощнику из другого места в приложении, предположим, что вы должны учитывать его в функции.

  2. Чтобы быстро отладить помощник, оценить это в консоли клиента:

    Template.postsList.__helpers.get('filteredPosts')(...parameters); 
    
  3. Существует пакет, который может помочь с шаблонами отладки и помощниками шаблона: prasad19sara:client-debugger.

+1

Как мне получить доступ к глобальным помощникам? – Kostanos

+0

@Kostanos UI._globalHelpers.yourHelperName (... parameters) для вызова UI.registerHelper ('yourHelperName', function() {}) – Turbo

3

Это официально не отвечает на вопрос, но я хотел бы поделиться простой техникой, которая практически решает большинство проблем, которые вы описали.

Предположим, у нас есть группа помощников, с которой мы хотим иметь доступ из разных частей вашего приложения как из шаблонов, так и непосредственно из нашего кода 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

+0

Nice pattern!Было бы хорошим дополнением к [ostrio: templatehelpers] (https://atmospherejs.com/ostrio/templatehelpers) или [aldeed: template-extension] (https://atmospherejs.com/aldeed/template-extension). –

+0

Спасибо! Это также очень полезно. Я тестировал несколько проектов, и это действительно помогает сделать вещи организованными. –