初めてjsrender/jsviewsを使用してみました。素晴らしいように見えますが、生成されたコンテンツのイベント ハンドラーを動的にバインドする方法の明確なドキュメントや例が見つかりません。
たとえば、純粋な jQuery の古いアプローチは次のとおりです。
オブジェクトのコレクションをレンダリングする Bean クラスからのコード:
container = $('#tabs-my');
this.load( // Obtain array of objects
$.proxy(function(list){
container.html('');
list.forEach(
$.proxy(function(it, i){
container.append(this.renderItem(it));
}
,this)
);
}
,this)
);
そして、オブジェクト自体の render メソッドで:
,renderItem: function(/*Specialist*/ it){
var container = $('<div class="specialist-item" />')
container.append(
$('<span class="x">Remove</span>').click($.proxy(function(){
this.removeSpecialistFromList(it.id)
}
,this))
);
container.append(
$('<span class="x">Edit</span>').click($.proxy(function(){
this.renderSaveForm(container)
}
,this))
);
container.append('<p><b>' + it.name + '</b> <i>' + it.phone + '</i></p>' +
'<p>' + it.skill + '</p>' +
( it.city ? '<p>' + it.city.name + '</p>' : ''));
return container;
}
タグ自体に外部識別子を使用せずに、現在のオブジェクトのクロージャー コンテンツを介してハンドラーをバインドすることに注意してください。次に、テンプレートを使用して、コンテンツを視覚化から分離してみます。
私のテンプレート:
<div class="specialists-list">
Items in list: {{:specialists.length}}
{^{for specialists}}
<div class="specialist-item">
<span class="x">Remove</span><span class="x">Edit</span>
<p><b class="name">{{:name}}</b> <i class="phone">{{:phone}}</i></p>
<p class="skill">{{:skill}}</p>
<p class="city">{{:city.name}}</p>
</div>
{{/for}}
</div>
そして次のようにレンダリングされます:
var template = $.templates({
specialistsTmpl: tmpl
});
$.templates.specialistsTmpl.link(container, {
specialists: list
});
次のような属性で一般的なハンドラーを使用して実行できることを認識しています。
<span class="x" data-id="{{:id}}">Edit</span>
そして、そのオブジェクトを外部から再度取得してみてください。しかし、これは回避策であり、望ましくありません。テンプレートまたはヘルパー、カスタム タグを介してハンドラーをバインドする方法はありますか?