Ignite UI for Blazor が提供する各種コンポーネントのカスタマイズにあたっては、JavaScript による実装で DOM の生成を必要とする場合があります。
そのような場合、以下のように HTML 標準の DOM API を駆使して生成するのが、まずは基本になります。
igRegisterScript("...", (context) => { const container = document.createElement("div"); container.classList.add("container"); container.classList.add("stack"); container.classList.add("vertical"); const firstLine = document.createElement("div"); container.appendChild(firstLine); firstLine.classList.add("first-name"); firstLine.textContent = context.item.firstName; const secondLine = document.createElement("div"); container.appendChild(secondLine); firstLine.classList.add("last-name"); firstLine.textContent = context.item.lastName; return container; }, false);
上記スクリプトで生成される DOM は以下のような HTML に相当します。
<div class="container stack vertical"> <div class="first-name"> Jhon </div> <div class="last-name"> Smith </div> </div>
生成される DOM はそこまで複雑ではないですが、それを生成する冒頭の JavaScript プログラムは行数も多く、一読しただけでは最終的な DOM 構造も想像しにくいです。
このような場合に、Ignite UI for Blazor から提供されている igTemplating オブジェクトを使用すると、文字列に基づくテンプレートから簡潔に DOM 構造を生成することができます。
igTemplating オブジェクトには html というプロパティが公開されており、これと JavaScript の文字列補間の機能が組み合わされることで、HTML の構文で DOM 生成が可能となります。具体的には、冒頭のスクリプトと同等の DOM 生成は、igTemplating を使うと、以下のように実装できます。
igRegisterScript("...", (context) => { return igTemplating.html`<div class="container stack vertical"> <div class="first-name"> ${context.item.firstName} </div> <div class="last-name"> ${context.item.lastName} </div> </div>`; }, false);
上記のとおり、igTemplating を使用すると、極めて直感的に DOM 構造を記述でき、値の埋め込みも JavaScript の文字列補間構文のまま、${…} の間に埋め込む値の式を記述するだけで済みます。
igTemplating.html`….` が返す値は、DOM 要素オブジェクトではなく、”テンプレート結果” というデータ構造です。Ignite UI for Blazor のコンポーネントはテンプレート結果を受け取るとそこから DOM を生成して使用するようになっています。
以上、Ignite UI for Blazor の利用にあたって JavaScript プログラムによる DOM 生成が必要な場合は、igTemplating オブジェクトを利用することで、API 呼び出しを駆使することなく、直感的な HTML 構文の文字列で実装できます。