12

テンプレートで switch ケースを処理する最良の方法は何ですか (例: 4 つの可能な状態を持つボタン)? ヘルパーに html を引き出すのは間違っているように思えますが、ロジックをテンプレートに入れるのも同じくらい悪いと感じています...

編集:

ご覧のとおり、html をヘルパーに配置するのは理想とはほど遠いですが、クラス、タグ名、プロパティ、およびコンテンツを変更すると、テンプレートが完全に判読できなくなります。

Template.nextMeetup.helpers({
    rsvpButton: function(rsvp) {
        var button;

        switch(rsvp){
            case 'yes':
                button = '<a ' + this.event_url + 'class="rsvp btn btn-success pull-right" title="visit event page" target="_blank"><i class="icon-check"></i> I\'m Attending</a>';
            break;
            case 'maybe':
                button = '<a ' + this.event_url + 'class="rsvp btn btn-warning pull-right" title="visit event page" target="_blank"><i class="icon-warning-sign"></i> I might go</a>';
            break;
            case 'no':
                button = '<a ' + this.event_url + 'class="rsvp btn btn-danger pull-right" title="visit event page" target="_blank"><i class="icon-remove"></i> I\'m not going</a>';
            break;
            case 'none':
                button = '<a ' + this.event_url + 'class="rsvp btn btn-inverse pull-right" title="visit event page" target="_blank"><i class="icon-spinner"></i> I havn\'t decided</a>';
            break;
            default:
                button = '<button class="rsvp signIn btn btn-disabled pull-right">Sign in to RSVP</button>';
        }
        return new Handlebars.SafeString(button);
    }
});
4

2 に答える 2

11

何を出力しようとしているのかはわかりませんが、同等性を評価するヘルパーが関与する可能性があります。これをプロジェクトのクライアントがロードする JavaScript ファイルの 1 つに入れます。

Template.registerHelper("equals", function (a, b) {
  return (a == b);
});

if次に、ブロックと新しいequalsヘルパーを使用して、switch-case 構造に似たものを作成できます。たとえば、ボタンの状態を という名前の変数に格納していてbtnState、可能な値が12またはの場合3:

<button class="{{#if equals btnState 1}}btn-active{{/if}}
               {{#if equals btnState 2}}btn-inactive{{/if}}
               {{#if equals btnState 3}}btn-disabled
               {{else}}btn-default{{/if}}">

switch-caseが真の値に達した後、さらにテストを短縮する機能が必要な場合、および/または最後にデフォルトのケースが必要な場合、その方法は、ネストされたif-elseブロックの醜いセットを使用することです。

<button class="{{#if equals btnState 1}}
                 btn-active
               {{else}}
                 {{#if equals btnState 2}}
                   btn-inactive
                 {{else}}
                   {{#if equals btnState 3}}
                     btn-disabled
                   {{else}}
                     btn-default
                   {{/if}}
                 {{/if}}
               {{/if}}">

この例はほとんど単純です。これを大きなテンプレートの制御構造として使用していると仮定しています。代わりに、btn-default数十行の HTML があります。

CSS クラス名のようなテキストの短いスニペットに実際に使用している場合は、一連のケースを返される文字列のセットにマップするヘルパーを代わりに作成できます。例 (CoffeeScript):

Template.registerHelper "switch", (input, cases, output, def) ->
  # input is the variable we're comparing, i.e. switch(input)
  # cases is an EJSON-stringified array, i.e. case "foo", case "bar"
  # output is an EJSON-stringified array of strings to return for each case
  # def (default) is a string to return if none of the cases are met

  # Validate input, convert EJSON strings into arrays:
  unless input? and _.isString(cases) and _.isString(output)
    return ""
  cases = EJSON.parse cases
  output = EJSON.parse output
  unless _.isArray(cases) and _.isArray(output) and 
    cases.length is output.length
      return ""

  # Evaluate each case, returning as soon as the first case is true:
  for value, index in cases
    return output[index] if input is value

  # If we've made it this far, none of the cases were met; return def (default):
  if def? and _.isString(def) then return def else return ""

そしてそれを使用するには:

{{switch btnState "[1,2,3]"
  "[\"btn-active\",\"btn-inactive\",\"btn-disabled\"]" "btn-default"}}

Handlebars では、配列またはオブジェクトをヘルパーに渡すことができないため、パラメーターとして渡されてから解析される JSON 文字列のゆがみが発生します。

于 2013-07-15T02:06:16.413 に答える
7

ボタンごとに 1 つのテンプレートと追加の動的テンプレートを使用する

動的テンプレートを返すテンプレート ヘルパー:

Template.nextMeetup.helpers({
    rsvpButtonTemplate: function(rsvp) {
        switch(rsvp){
            case 'yes':   return Template.buttonYes;
            case 'maybe': return Template.buttonMaybe;
            case 'no':    return Template.buttonNo;
            case 'none':  return Template.buttonNone;
        }
    }
});

テンプレート ヘルパーを呼び出すメイン テンプレート:

<template name="myPage">
    ...
    {{> rsvpButtonTemplate}}
    ...
</template>

あなたの 4 つのボタン:

<template name="buttonYes">
    <a {{event_url}} class="rsvp btn btn-success pull-right" title="visit event page" target="_blank"><i class="icon-check"></i> I'm Attending</a>
</template>
<template name="buttonMaybe">
    <a {{event_url}} class="rsvp btn btn-warning pull-right" title="visit event page" target="_blank"><i class="icon-warning-sign"></i> I might go</a>
</template>
<template name="buttonNo">
    <a {{event_url}} class="rsvp btn btn-danger pull-right" title="visit event page" target="_blank"><i class="icon-remove"></i> I'm not going</a>
</template>
<template name="buttonNone">
    <a {{event_url}} class="rsvp btn btn-inverse pull-right" title="visit event page" target="_blank"><i class="icon-spinner"></i> I havn't decided</a>
</template>
于 2014-07-02T14:02:40.687 に答える