現在はJavaScriptによる画面レンダリングツール「JsRender」について連載しています。
今回も公式サイトに乗っていない秘密機能「parent」についてのご紹介です。
必要になるシチュエーション
#parentはfor文の真っ最中などで、親クラスを遡ってパラメータを取得する機能です。例えば、私は「技術開発事業部」の所属ですが、同じ部にはメンバーが何人もいます。
- 技術開発事業部:Aさん
- 技術開発事業部:Bさん
- 技術開発事業部:Cさん
こういう場合、データの持ち方によっては
- 親クラス:部署
- 子クラス:メンバー
というように、親子関係が生ずることになります。
このデータの持ち方で所属とメンバーを表現したい場合は、以下のような形式にするのが合理的です。
<div id="result"></div> <script id="jsRenderTmpl" type="text/x-jsrender"> ★{{:department}} {{for members}} <div> ・{{:name}} </div> {{/for}} </script> <script> var data = { "department": "技術開発事業部", "members": [ {"name": "Aさん"}, {"name": "Bさん"}, {"name": "Cさん"} ] }; var template = $.templates("#jsRenderTmpl"); var htmlOutput = template.render(data); $("#result").html(htmlOutput); </script>
しかしですね、場合によっては以下みたいな表示にしたいケースもあるわけですよ。
これは痛いんですよね。
何故なら、階層が違うから。
JSONの定義では「members」をfor文のスコープとして回していますので、membersより配下のデータを表示する場合は何も難しくありません。
普通に順を追って定義していけば表示出来ます。
しかし、membersより上のデータはスコープの中に入っていませんので、単純に取得することが出来ません。
今回のテーマである#parentはこういう場合に使用します。
#parentを活用
#parentは、まあ、タグ名から分かりますようにfor文のスコープの外にある親データを取ってくる機能です。その実装方法はこちら。
<script id="jsRenderTmpl" type="text/x-jsrender"> {{for members}} <div> ・{{:#parent.parent.data.department}}:{{:name}} </div> {{/for}} </script> <script> var data = { "department": "技術開発事業部", "members": [ {"name": "Aさん"}, {"name": "Bさん"}, {"name": "Cさん"} ] }; var template = $.templates("#jsRenderTmpl"); var htmlOutput = template.render(data); $("#result").html(htmlOutput); </script>
「#parent.parent.data.department」、これで「技術開発事業部」という値が取れています。
詳細解説
「あれ? parent2連打になってるのは何?」と思われたかと思います。jsrenderでは「parent」を一個各毎に階層を一個遡るという意味になります。
今回の場合、スタート地点となるのはfor文の中のメンバーですから、
- 単にそのレコードを出したい場合⇒「#data.name」(dataは通常省略)
- その一個上のmembersを取りたい場合⇒「#parent.data」
- その一個上のdataを取りたい場合⇒「#parent.parent.data」
- 目的のdepartmentはdataの子供なので⇒「#parent.parent.data.department」
こういうわけです。
parentを連結することで一回一番上まで遡って、それからdepartmentを狙い撃ちするという段取りになるわけです。
parentを連発する辺り最初は戸惑いますが、分かってしまえば簡単なことですね。
終わりに
今回ご紹介した#parentは結構便利な機能です。これを知らないと画面を表示する為にクラスを非正規化しなければならなくなり、手間も転送データ量も増えて大変ですからね。
上手く活用すれば開発効率もUPするでしょう。
ぜひマスターすることをオススメします。