15

次のようなコントローラーオブジェクトがあります。

MyApp.objController = Ember.ArrayController.create({
  init: function(data) {
    data.isValid = function() {
      return (data.validity === "valid");
    }
    this.pushObject(MyApp.MyObj.create(data));
  }
});

私の見解は次のようなものです:

{{#each MyApp.objController}}
  {{#if isValid}}
   <some markup>
   {{else}}
   <some other markup>
  {{/if}}
{{/each}}

Handlebarsの条件は値と関数の両方を受け入れると想定していましたifが、そうではないようです。それは実際に可能ですか?私はそれを間違っていますか?

4

4 に答える 4

9

if ステートメントは、値が存在するかどうかのみを比較し、それが偽の値 (つまり、存在しない、0、空の文字列など) であるかどうかを比較します。カスタム ヘルパー関数を作成する必要があります。

あなたはこのようにすることができます

Handlebars.registerHelper('isValid', function (value, options) {
    if (value == "valid") {
        return options.fn(this);
    }
    return options.inverse(this);
});

これにより、ブロック ヘルパーが登録されます。渡した値が「有効」と評価された場合、現在のデータを持つヘルパーに続くテンプレートが返されます。有効であると評価されない場合、現在のデータを含むelseステートメントに続くテンプレートを返します。

次に、テンプレートで次のように使用できます

{{#each MyApp.objController}}
    {{#isValid validity}}
        <some markup>
    {{else}}
        <some other markup>
    {{/isValid}}
{{/each}}

それ以外の場合は、Handlebars の精神に従って「ロジックのない」テンプレートを実行する場合は、テンプレートをレンダリングする前に、そのデータが有効かどうかを示すフラグを設定し、ハンドルバーのヘルパーをフラグと共に使用します。

このケースやその他のケースを処理する汎用関数をセットアップすることもできます。一般的なifの例については、handlebars.js {{#if}}条件付きの論理演算子で私の回答を参照してください(上記の回答と同様)

于 2012-08-15T00:05:49.053 に答える
6

isValidをとして定義すると、カスタムハンドルバーヘルパーを作成せずにステートメントpropertyで使用できます。http ://jsfiddle.net/pangratz666/Dq6ZY/を参照してください。if

ハンドルバー

<script type="text/x-handlebars" data-template-name="obj-template" >
    {{view Ember.TextField valueBinding="age" }}
    {{#if isValid}}
        Si Si.
    {{else}}
        Nope!
    {{/if}}
</script>​

JavaScript

App.MyObj = Ember.Object.extend({
    isValid: function() {
        return this.get('age') >= 18;
    }.property('age')
});

Ember.View.create({
    templateName: 'obj-template',
    controller: App.MyObj.create({
        age: 21
    })
}).append();

</ p>

于 2012-08-15T06:30:25.543 に答える
-1

これを行うには、カスタム Handlebars ヘルパーを作成できます。

于 2012-08-01T20:06:29.483 に答える
-3

これを試して:

<ul>
  {{#each subsites}}
    {{#if this}}
      <li>{{{WhatIsTheSiteFor this}}}</li>
    {{else}}
      <li>no found</li>
    {{/if}}
  {{/each}}
</ul>

ヘルパー関数WhatIsTheSiteFor:

Handlebars.registerHelper('WhatIsTheSiteFor', function(siteName) {
  var subSiteName = '',
      siteNameStr = '';

  $.each(siteName, function(i, item) {
    siteNameStr += item;
    return siteNameStr;
  });

  if(siteNameStr === 's.gbin1.com') {
    subSiteName = '<a href="http://' + siteNameStr + '">GB搜索引擎</a>';
  }
  else if (siteNameStr === 'm.gbin1.com') {
    subSiteName = '<a href="http://' + siteNameStr + '">GB手机阅读</a>';
  }
  else if (siteNameStr === 'rss.gbin1.com') {
    subSiteName = '<a href="http://' + siteNameStr + '">RSS消息订阅</a>';
  }

  return subSiteName;
});

デモはここにあります: http://www.gbin1.com/gb/networks/uploads/71bb1c1e-0cd3-4990-a177-35ce2612ce81/demo6.html

于 2013-01-03T06:42:11.057 に答える