15

同じ関数の戻り値を確認したい 2 つのハンドルバー テンプレートがある場合はどうすればよいですか? これを行う正しい方法はありますか?明らかに私はこれを行うことができます:

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

もちろん、テンプレートはこの機能を見つけられません。

ベストプラクティスなどに興味があります。ありがとう!

4

7 に答える 7

17

より良いバージョンは次のようになると思います(ハンドルバーを使用する場合、これがデフォルトです):

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

{{my_helper}} を使用して、任意のテンプレートからこれを呼び出すことができます!

それが役に立てば幸い :)

于 2012-04-19T20:41:40.587 に答える
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

次に、テンプレートを宣言した後、上記の mixin を使用してテンプレートを拡張できます。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}}して処理することができます。clickmerge_login

于 2013-03-24T17:28:06.520 に答える
2

Meteor 1.0 では、これが変更されたようです。掘り下げた結果、以下を使用してヘルパー間でコードを再利用できることがわかりました。

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

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

これにより、すべてのヘルパーで利用できるようになります!

于 2014-11-03T11:26:37.337 に答える
1

あなたが求めていることを理解しているかどうかはわかりませんが、あなたがしていることに問題はありません.関数を複数回再利用するために変数に割り当てました.

入力を減らしたい場合や、たとえば 2 つではなく 20 の異なるテンプレートで再利用する場合は、次のようにすることができます。

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;
于 2012-04-19T04:59:55.087 に答える
0

Gezim の優れた回答をいじった後、Meteor 1.3+ で簡単に実行できることに気付きました。

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

しかし、extendTemplate 関数が必要な場合:

// 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: { ... },
});
于 2017-01-03T21:10:19.843 に答える