0

リスト テーブル テンプレートにコンボボックスを追加しました。モデル内のデータベースに応じてコンボボックスをレンダリングしたいのですが、何が問題なのですか? 助けてください..

<script type="text/x-handlebars-template" id="listItemTmpl">
<tr>                             
    <td>{{partNo}}</td>
    <td>
         <select name="selectCombo" id="selectCombo">
                {{#each chks}}
                <option value='{{myModel.id}}' {{#if(this.id==myModel1.status)}}selected{{/if}}>{{myModel1.name}}</option>
                {{/each}}
            </select>
    </td>
</tr>

</script>

2 つのモデルがあります。一つは、

 myModel1=Backbone.Model.extend({
    url:url,
    defaults:{
      name:"",
      status:""
  }
 });

その他は;

myModel=Backbone.Model.extend({
  url:url,
  defaults:{

  }
});
4

3 に答える 3

4

問題は、それがハンドルバーの仕組みではないということです。式{{#if(this.id==myModel1.status)}}は有効なハンドルバーの if-block ではありません。

Handlebars は、セマンティックで宣言型のテンプレート エンジンです。任意の JavaScript 式はサポートされていません。ブロックで確認できる唯一のこと#ifは、何かが真であるか ( falseundefinednull""またはではない[]) かどうかです。

推奨される方法は、テンプレートをレンダリングする前に条件を評価し、viewmodel を使用して結果をテンプレートに渡すことです。あなたの場合、配列isSelected内の各オブジェクトにプロパティを追加chksし、テンプレートでそれを単純に評価できます

{{#if isSelected}}selected{{/if}}

ハンドルバーの使用方法の例については、 handlebars.js のドキュメントを参照してください。

于 2012-12-10T14:05:07.787 に答える
1

isSelected通常、フラグを使用する必要があり、フェンクリフの回答がそれをカバーしています。ただし、余分なフラグを追加することが合理的なオプションではない場合もあります。その場合は、{{#ifeq}}ヘルパーを追加できます。このような単純なもの:

Handlebars.registerHelper('ifeq', function(a, b, block) {
    return a == b ? block() : block.inverse();
});

そして、テンプレートで:

<option value='{{myModel.id}}' {{#ifeq id myModel1.status}}selected{{/ifeq}}>{{myModel1.name}}</option>

デモ: http://jsfiddle.net/ambiguous/rsyv9/

于 2012-12-10T17:05:32.997 に答える
1

ただの更新。Handlebars の最新バージョンでは、block() ではなく block.fn() が使用されていました。そうしないと、エラーが発生する可能性があります。

Handlebars.registerHelper('ifeq', function(a, b, block) {
    return a == b ? block.fn() : block.inverse();
});
于 2013-06-27T17:25:08.003 に答える