1

問題のテンプレートは次のとおりです。

<template name="tables">
    <div class="table-area">
        {{#each tableList}}
          {{> tableBox}}
        {{/each}}
    </div>
</template>

<template name="tableBox">
<table id="{{name}}" class="table table-condensed table-striped">
    <tr>
        <td>{{name}}</td>
        <td> Min:</td>
        <td>{{minBet}}</td>
        <td>{{cPlayers}}</td>
    </tr>
    <tr>
        <td>Dice1</td>
        <td>Dice2</td>
        <td>Dice3</td>
        <td>Total</td>
    </tr>
    {{#each table [{{name}}]}}
      {{> tableRow}}
    {{/each}}
    </table>
</template>

<template name="tableRow">
    <tr>
        <td>{{Roll.dice1}}</td>
        <td>{{Roll.dice2}}</td>
        <td>{{Roll.dice3}}</td>
        <td>{{Roll.total}}</td>
    </tr>
</template>

Meteor ハンドルバーの機能は次のとおりです。

Template.tables.tableList = function(){
    return Tables.find();
}

Template.tableBox.table = function(tableID){
    return Rolls.find({tableName: tableID});
}

問題は、画面に表示される各テーブルにすべての「ロール」がリストされていることです (100 行すべて)。パラメータでフィルタリングする代わりに、テーブル名 {{name}} である Roll テンプレート関数にパススルーしようとしています。

TableBox の「table id」タグで、{{name}} が正しく変換されます。つまり、「T1」、「T2」、「T3」などですが、dbクエリから適切にフィルタリングするために関数に渡す必要があるのは同じTableIDです。これをもっと簡単に行う方法はありますか?可能であれば、ここで物事を行う方法をテンプレート化するハンドルバーに固執したいと思います。

参考までに、テスト データの JSON 初期化コードを以下に示します。

//initiate tables
for (i = 1; i < 11; i++) {
    Tables.insert({
        name: 'T' + i,
        minBet: '300',
        cPlayers: '(8)'
    });
}

//initiate rolls within tables
for (i = 1; i < 11; i++) {
for(j=1; j<11; j++){
var die1 = ((Math.floor(Math.random() * 5) +1).toString());
var die2 = ((Math.floor(Math.random() * 5) +1).toString());
var die3 = ((Math.floor(Math.random() * 5) +1).toString());
var t = (parseInt(die1) + parseInt(die2) + parseInt(die3)).toString();

Rolls.insert({
    Roll: {
        tableName: 'T' + i,
        rollNumber: j;
        dice1: die1,
        dice2: die2,
        dice3: die3,
        total: t
         },
      });
    }
}
4

1 に答える 1

2

わかりました-試行錯誤の後-それを理解しました:

ヘルパー関数で:

Template.tableBox.table = function(tableID){
    return Rolls.find({"Roll.tableName": tableID});
}

ネストされた Roll.tableName プロパティ名を追加する必要がありましたが、クエリとして括弧内に入れました。

そして、tableBox テンプレートに戻ります。

<template name="tableBox">
  <table id="{{name}}" class="table table-condensed table-striped">
    <tr>
        <td>{{name}}</td>
        <td> Min:</td>
        <td>{{minBet}}</td>
        <td>{{cPlayers}}</td>
    </tr>
    <tr>
        <td>Dice1</td>
        <td>Dice2</td>
        <td>Dice3</td>
        <td>Total</td>
    </tr>
    {{#each table name}}
      {{> tableRow}}
    {{/each}}
  </table>
</template>

関数の「名前」引数に中括弧は必要ありません。どういうわけか、ハンドルバーと Meteor は、中括弧なしで参照しているコンテキストを認識し、それを tableBox の {{name}} 内にあるように適用します。つまり、「T1」、「T2」、「T3」が関数に正しく渡され、独自のテーブルには個々のテーブルに固有のロールのリストのみが含まれるようになりました。

于 2014-03-13T06:39:44.447 に答える