Вопрос по – Совместное использование функций между шаблонами в Meteor

15

Что если у меня есть два шаблона руля, которые хотят проверить возвращаемое значение одной и той же функции? Есть ли правильный способ сделать это? Очевидно, я мог бы сделать это:

var say_foo = function() {
  alert('foo');
};

Template.foo.say_foo = say_foo;
Template.bar.say_foo = say_foo;

Но есть ли способ сделать это напрямую через объект Template? Поскольку это JavaScript, я могу назначить функцию любому свойству любого объекта, но я попытался сделать:

Template.say_foo = function() { alert('foo'); };

и, конечно, шаблоны не находят эту функцию.

Просто любопытно о лучших практиках и тому подобное. Спасибо!

Ваш Ответ

7   ответов
1

Template.foo.say_foo = 
Template.bar.say_foo = function() { alert('foo'); };
17

что лучшая версия будет (если вы используете руль, который по умолчанию):

Template.registerHelper('my_helper', function() {
     // code
});

Вы можете вызвать это из любого шаблона, используя {{my_helper}}!

Надеюсь, поможет :)

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

что я придумал, чтобы решить эту проблему. Это делается с помощью CoffeeScript. Если вы не используете CoffeeScript, вы можете преобразовать его в JavaScriptВот.

Сначала определитеextendTemplate функция:

extendTemplate = (template, mixin) ->
  helpers = ({name, method} for name, method of mixin when name isnt "events")
  template[obj.name] = obj.method for obj in helpers

  if mixin.events?
    template.events?.call(template, mixin.events)

  template

Затем объявите объект с помощниками и событиями (мой называетсяloginMixin) которым вы хотите поделиться в нескольких шаблонах:

loginMixin =
  merge_with_email: ->
    return Session.get 'account_merge__merge_with_email'

  events:
    'click button#merge_login': (event, template) ->

      email = $(template.find('#email')).val()
      password = $(template.find('#password')).val()

      Meteor.loginWithPassword email, password, (error)->
        if error
          console.error "Failed to login."

      return false

Затем, после объявления ваших шаблонов, вы можете расширить их с помощью вышеупомянутого миксина. С помощью следующего кода я расширяюregister а такжеlogin шаблоны:

extendTemplate Template.register, loginMixin
extendTemplate Template.login, loginMixin

Наконец, вот как мойlogin.html может выглядеть так:

<template name="login">
    <div class="alert">
        <a class="close" data-dismiss="alert" href="#">×</a>
        <h4 class="alert-heading">Merge accounts</h4>
        <form id="register_form" class="form-inline" action="#">
            <p class="help-block">Please login with {{merge_with_email}}.</p>
            <label for="email">Email:</label>
            <input id="email" type="text" class="input-medium" />
            <label for="password">Password:</label>
            <input id="password" type="password" class="input-medium" />
            <button class="btn" id="merge_login">Login</button>
        </form>
    </div>
</template>

Так как я продлилregister шаблон, а такжеregister.html также можно использовать{{merge_with_email}} и иметьclick событиеmerge_login кнопка также обрабатывается.

Error: User Rate Limit ExceededTemplate.instance()Error: User Rate Limit Exceeded
0

который я понял в Meteor 1.3+, вы можете просто запустить:

Template.register.helpers(MyMixin.helpers);
Template.register.events(MyMixin.helpers);

Но если вы хотите использовать функцию exteTemplate:

// Note: above code is probably simpler.

function extendTemplate(template, mixin) {
  if (mixin.helpers && template.helpers) {
    template.helpers(mixin.helpers);
  }
  if (mixin.events && template.events) {
    template.events(mixin.events);
  }
  return template;
};

extendTemplate(Template.register, {
  events: { ... },
  helpers: { ... },
});
1

что я понимаю, о чем вы спрашиваете, но я не вижу ничего плохого в том, что вы делаете - вы присвоили функцию переменной, чтобы использовать ее несколько раз.

Если вам нужно набрать меньше или, скажем, использовать 20 различных шаблонов, а не 2, вы можете сделать что-то вроде этого:

var templates = ['foo', 'bar', 'baz', 'barz', 'bliz', blaz'];
for (var i=0; i < templates.length; i++) { 
    Template[templates[i]].say_foo = say_foo;
}

Но IMO это менее читабельно, и в этом нет особой необходимости делать это.

РЕДАКТИРОВАТЬ - лучшее решение

Просто понял, почему вы можете захотеть сделать это - чтобы убедиться, что каждый шаблон имеетsay_foo атрибута, поэтому вам нужно беспокоиться о добавлении его вручную каждый раз, когда вы создаете новый шаблон, вы можете сделать это:

for (var t in Template)
    Template[t].say_foo = say_foo;
2

похоже, все изменилось. После некоторых копаний я обнаружил, что теперь вы можете использовать следующее для повторного использования кода между помощниками:

https://docs.meteor.com/#/full/template_registerhelper

Template.registerHelper("checkedIf",function(value){
  return (value)? "checked":"";
});

Это делает его доступным для всех помощников!

16

According to the Meteor documentation, the correct way would be to use UI namespace, which would bind to whatever template engine used underneath, instead of using Handlebars, or spacebars directly. Here is the link in documentation. http://docs.meteor.com/#ui_registerhelper

Таким образом, для доступа к универсальной функции из любого шаблона используйте в client.js:

UI.registerHelper('stub', function() {
     // code
});

Update:

Видимодокументы вернулись к использованию:

Template.registerHelper('stub', function() {
     // code
});

Затем в html-файле используйте{{stub}} чтобы получить доступ к переменной.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededblazejs.org/api/templates.html#Template-registerHelper
Error: User Rate Limit ExceededTemplate.registerHelper.
Error: User Rate Limit Exceeded Samo

Похожие вопросы