わかりました @Amateur では、ニーズを適切に解決してみましょう。
注意: すべてのコードは自由気ままに書かれています。箱から出してすぐに動作するとは思わないでください。インスピレーションとして使用してください。
まず第一に、テンプレートでプログラムロジックを使用することはあまり良い考えではありません。これは単なる設計上の決定です。ここではあまりアカデミックに見えたくありませんが、これに柔軟性がありすぎると、非常に難しいもので終わる可能性があると思いますメンテナンスコードへ。
したがって、テンプレートが決定/計算を行う必要がないように、データを製造するという考え方です。テンプレートにループが必要な場合は、サブテンプレートを使用しましょう。
あなたのコード例から私が理解しているのは、次のようなコレクションがあるということです:
[
{
"id": "1",
"cost": 100,
"name": "Amateur"
},
{
"id": "2",
"cost": 200,
"name": "Other name"
},
{
"id": "3",
"cost": 300,
"name": "Other name again"
},
]
そして、次のようなものをレンダリングしたいとします:
<table>
<tr>
<td>Name</td>
<td>Cost</td>
</tr>
<tr>
<td>Amateur</td>
<td>100</td>
</tr>
<tr>
<td>Other name</td>
<td>200</td>
</tr>
<tr>
<td>Other name again</td>
<td>300</td>
</tr>
</table>
あなたが送信した別の(重複した)質問を読んだので、次のようにcost
の場合にのみレンダリングする必要もあります。name == "Amateur"
<table>
<tr>
<td>Name</td>
<td>Cost</td>
</tr>
<tr>
<td>Amateur</td>
<td>100</td>
</tr>
<tr>
<td>Other name</td>
<td>--</td>
</tr>
<tr>
<td>Other name again</td>
<td>--</td>
</tr>
</table>
反復
繰り返しのために、サブテンプレートで解決します。
マスター テンプレート:
<script type="text/template" id="template-elements">
<table>
<tr>
<td>Name</td>
<td>Cost</td>
</tr>
</table>
</script>
サブテンプレート
<script type="text/template" id="template-element">
<tr>
<td><%= name %></td>
<td><%= cost %></td>
</tr>
</script>
よりエレガントView
にするために、 forCollection
とSubView
for eachも使用してみましょうModel
。
var MyModel = Backbone.Model.extend();
var MyCollection = Backbone.Collection.extend({
model: MyModel
});
var MyModelView = Backbone.View.extend({
template: _.template( $("#template-element").html() ),
render: function(){
this.$el.html( this.template( this.model.toJSON() ) );
return this;
}
});
var MyCollectionView = Backbone.View.extend({
template: _.template( $("#template-elements").html() ),
render: function(){
this.$el.html( this.template() );
this.collection.each( function( model ){
var view = new MyModelView({ model: model });
this.$el.find( "table" ).append( view.render().el );
});
return this;
}
});
デコレータ
Model.cost
繰り返しの問題を解決したので、 whenを非表示にするロジックを実装しModel.name != "Amateur"
ます。
Model
すでにクックされたテンプレートの属性を返すメソッドを実装しましょう:
var MyModel = Backbone.Model.extend({
toJSONCooked: function(){
var json = this.toJSON();
if( this.get( "name" ) != "Amateur" ) {
json.cost = "--";
}
return json;
}
});
このメソッドを使用して、テンプレートをフィードできます。
var MyModelView = Backbone.View.extend({
template: _.template( $("#template-element").html() ),
render: function(){
this.$el.html( this.template( this.model.toJSONCooked() ) );
return this;
}
});