今作っているページは
「クローラーが回れるようにHTMLをサーバー側で吐き出しつつ、動的な処理はBackbone.jsで制御」
なんてことをやっております。
ところがハタと手が止まった。レンダリング済みのHTMLからModelとViewを作るにはどうすればいいんだ?
とりあえずやってみた
HTML側はこんな感じ。各リストタグ(li)が一個のView & Modelに該当。各リスト内にinput hiddenでModelとするデータを埋める。
<div id='tag_list_area'> <p>タグリスト <small>(クリックで選択/選択解除)</small></p> <ul id='tag_list'> <li> <input type='hidden' name='tag_name_1' class='tag_name' value='ほげ'/> <input type='hidden' name='tag_id_1' class='tag_id' value='1'/> <input type='hidden' name='selected_1' class='tag_selected' value='0'/> <a href='#' class='tag'>ほげ</a> </li> <li> <input type='hidden' name='tag_name_2' class='tag_name' value='ふが'/> <input type='hidden' name='tag_id_2' class='tag_id' value='2'/> <input type='hidden' name='selected_2' class='tag_selected' value='0'/> <a href='#' class='tag'>ふが</a> </li> <li> <input type='hidden' name='tag_name_3' class='tag_name' value='ぴよ'/> <input type='hidden' name='tag_id_3' class='tag_id' value='3'/> <input type='hidden' name='selected_3' class='tag_selected' value='0'/> <a href='#' class='tag'>ぴよ</a> </li> </ul> </div>
んで、jsは各リストタグ内のinput要素を読んでModel化。その後Viewに渡してやる。ついでに「el」にViewとして保持させたい要素を渡す。
$(function(){ // HTMLからModelとViewを作る $('#tag_list li').each(function(e){ var data = {}; var li = $(this); data.tag_name = li.children('.tag_name').val(); data.tag_id = li.children('.tag_id').val() -0; data.selected = li.children('.tag_selected').val() -0; var model = new TagModel(data); var view = new TagView({ el : li, model: model }); }); });
これでとりあえず動くけど・・・なんか不格好だな。もっといい方法はないものか。
この方法でタグをつけたり外したりする画面と処理を書いてみた。
HTMLはあらかじめ描画済みで、後からBackbone.jsのModelとViewを生成し動的処理を追加。
https://zafiel.wingall.com/data/taglist/tags.html
ファイル一式(Github)
うーん、もっとスマートな方法があれば教えてくださいまし。