String
index.html、index.jsを下記に変更しましょう
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title> sample </title> <script id="fs-js" src="http://localhost:8000/js/fairysupport.min.js" data-page-root="http://localhost:8000/page"></script> </head> <body> <div data-obj="obj"></div> <div><button data-name="sample">sample</button></div> </body> </html>index.js
export class Index { constructor() { } sample_click(event) { $f.loadStringTemplate(this.obj, this.template(), {'key1': '<input type="text">', 'key2': {'val1': 2}, 'key3': {"key1": "str1", "key2": "str2", "key3": "str3", "key4": "str4", "key5": "str5"}}) .then(this.success.bind(this)) .catch(this.error.bind(this)); } sample2_input(event) { this.obj2.textContent = event.target.value; } success(nodeList) { alert("success"); } error(exception) { alert("error"); console.error(exception); } template() { return ` <div>--data-text--</div> <div data-text='v.key1'></div> <div data-text='v.key1' data-tag='hidden'></div> <div>--data-html--</div> <div data-html='v.key1'></div> <div>--script--</div> <script data-load-only='true'> l.var = 1 + 2; </script> <div data-text='l.var'></div> <div>--data-attr--</div> <script data-load-only='true'> l.attr = {"style": "color: white; background-color: black;", "title" : "sample"}; </script> <div data-attr='l.attr'>data-attr</div> <div data-attr='{"style": "color: white; background-color: black;", "title" : "sample"}'>data-attr</div> <div>--data-prop--</div> <script data-load-only='true'> l.prop = {"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}; </script> <div data-prop='l.prop'>data-prop</div> <div data-prop='{"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}'>data-prop</div> <div>--data-if--</div> <div data-if='v.key2.val1 === 1'> v.key2.val1 === 1 </div> <div data-elseif='v.key2.val1 === 2'> v.key2.val1 === 2 </div> <div data-else=''> else </div> <div>--data-for--</div> <div data-for-start='l.i = 0' data-for-end='l.i < 10' data-for-step='l.i++'> <span data-if='l.i === 3' data-continue='1' data-tag='hidden'></span> <span data-if='l.i === 6' data-break='1' data-tag='hidden'></span> <div data-text='l.i'></div> </div> <div>--data-foreach--</div> <div data-foreach='v.key3' data-foreach-key='arrKey' data-foreach-value='arrVal'> <span data-if='l.arrVal === "str2"' data-continue='1' data-tag='hidden'></span> <span data-if='l.arrVal === "str4"' data-break='1' data-tag='hidden'></span> <span data-text='l.arrKey'></span> <span>:</span> <span data-text='l.arrVal'></span> </div> <div>--data-while--</div> <script data-load-only='true'> l.whileCount = -1; </script> <div data-while='l.whileCount < 8'> <script data-load-only='true'> l.whileCount++; </script> <div data-if='l.whileCount === 3' data-continue='1' data-tag='hidden'></div> <div data-if='l.whileCount === 6' data-break='1' data-tag='hidden'></div> <div data-text='l.whileCount'></div> </div> <input data-name='sample2' type='text'> <div data-obj='obj2'></div> `; } }
実行してsampleボタンをクリックしてみましょう
index.jsのtemplateメソッドの戻り値に、$f.loadStringTemplateの第三引数の値が埋め込まれて出力されます
loadStringTemplateメソッドは、第二引数に渡された文字列に、第三引数に渡された値を埋め込んで、第一引数のボディ部を置換するメソッドです
戻り値はPromiseです。テンプレートがwebページに埋め込まれ、新たに埋め込まれたテンプレートがjsと結びつけできたらresolveされます
resolveにはloadされたテンプレートの最上位階層のnodeの配列が渡されます
loadStringTemplateメソッドの第二引数をつくっているindex.jsのtemplateメソッドを見てみましょう
ただのテンプレートリテラルを返しています
data-ではじまる属性をタグにつけることで、loadStringTemplateに渡された第三引数をいろいろな形で埋め込むことができます
loadStringTemplateメソッドの第二引数に渡す文字列では、loadStringTemplateメソッドの第三引数をvという変数名で使うことができます。これはこのフレームワークの規則です
したがって、<div data-text='v.key1'></div>は、loadStringTemplateメソッドの第三引数のkey1要素をこのタグのボディ部にHTMLエスケープして出力することになります
data-tag='hidden'はこのタグのボディ部だけを出力して、タグは出力しません
data-htmlは与えられた値をhtmlエスケープせずに出力します
scriptタグにdata-load-only='true'をつけるとscriptタグの中をJavaScriptとして解釈して、そこで実行します。このscriptタグは削除されます
テンプレート内ではlというローカル変数を使用できます。lはオブジェクトです。これはこのフレームワークの規則です
data-attrは与えられた値をsetAttributeを使って属性の値を設定します
data-propは与えられた値を=演算子を使ってDOMに設定します。ネストされたオブジェクトを指定可能です
data-ifは与えられた値がtrueの場合、タグを出力します
data-elseifは前のdata-ifの値がfalseの場合、実行され、与えられた値がtrueの場合、タグを出力します
data-elseは前のdata-if、data-elseifの値がfalseの場合、タグを出力します
data-for-start、data-for-end、data-for-step、data-for-skipはセットで使います。data-for-startが最初に評価され、data-for-endがtrueの間は繰り返しタグが出力されます。タグが出力されるたびにdata-for-stepが評価されます。data-for-skipがtrueの場合、繰り返し処理をしません。
data-continueはループの先頭に戻ります。設定する値は何個上のループに戻るかを指定します。二重ループの最上位ループ先頭に戻る場合は2を指定します
data-breakはループのから抜けます。設定する値は何個上のループに戻るかを指定します。二重ループの最上位ループ先頭に戻る場合は2を指定します
data-foreach、data-foreach-key、data-foreach-value、data-foreach-skip、data-foreach-endはセットで使います。data-foreachに指定された配列やオブジェクトを繰り返し処理します。data-foreach-keyに指定した文字列がローカル変数lのキーとなり、そこにdata-foreachに指定された配列やオブジェクトのキーが格納されます。data-foreach-valueに指定した文字列がローカル変数lのキーとなり、そこにdata-foreachに指定された配列やオブジェクトの要素値が格納されます。data-foreach-skipがtrueの場合、繰り返し処理をしません。data-foreach-endがtrueの場合、繰り返し処理を終了します。
data-while、data-while-skip、data-while-stepはセットで使います。data-whileは指定された式がtrueの間、タグを繰り返し出力します。data-while-skipがtrueの場合、繰り返し処理をしません。data-while-stepは2回目以降の繰り返し処理の際に実行されます。
data-name、data-obj、data-listなど、jsに結びつく属性があれば、フレームワークによって自動的に結びつけられます
loadStringTemplateではなく、appendLoadStringTemplateにすると、ボディ部を置換ではなく、ボディ部に追加します
loadStringTemplateではなく、beforeLoadStringTemplateにすると、ボディ部を置換ではなく、第一引数の直前に追加します
loadStringTemplateではなく、afterLoadStringTemplateにすると、ボディ部を置換ではなく、第一引数の直後に追加します
テンプレートを別ファイルにする
index.html、index.jsを下記に変更しましょう
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title> sample </title> <script id="fs-js" src="http://localhost:8000/js/fairysupport.min.js" data-page-root="http://localhost:8000/page"></script> </head> <body> <div data-obj="obj"></div> <div><button data-name="sample">sample</button></div> </body> </html>index.js
export class Index { constructor() { } sample_click(event) { $f.loadTemplate(this.obj, 'tpl', {'key1': '<input type="text">', 'key2': {'val1': 2}, 'key3': {"key1": "str1", "key2": "str2", "key3": "str3", "key4": "str4", "key5": "str5"}}) .then(this.success.bind(this)) .catch(this.error.bind(this)); } sample2_input(event) { this.obj2.textContent = event.target.value; } success(nodeList) { alert("success"); } error(exception) { alert("error"); console.error(exception); } }
src/js/templates/tpl.htmlを作成しましょう
<div>--data-text--</div> <div data-text='v.key1'></div> <div data-text='v.key1' data-tag='hidden'></div> <div>--data-html--</div> <div data-html='v.key1'></div> <div>--script--</div> <script data-load-only='true'> l.var = 1 + 2; </script> <div data-text='l.var'></div> <div>--data-attr--</div> <script data-load-only='true'> l.attr = {"style": "color: white; background-color: black;", "title" : "sample"}; </script> <div data-attr='l.attr'>data-attr</div> <div data-attr='{"style": "color: white; background-color: black;", "title" : "sample"}'>data-attr</div> <div>--data-prop--</div> <script data-load-only='true'> l.prop = {"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}; </script> <div data-prop='l.prop'>data-prop</div> <div data-prop='{"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}'>data-prop</div> <div>--data-if--</div> <div data-if='v.key2.val1 === 1'> v.key2.val1 === 1 </div> <div data-elseif='v.key2.val1 === 2'> v.key2.val1 === 2 </div> <div data-else=''> else </div> <div>--data-for--</div> <div data-for-start='l.i = 0' data-for-end='l.i < 10' data-for-step='l.i++'> <span data-if='l.i === 3' data-continue='1' data-tag='hidden'></span> <span data-if='l.i === 6' data-break='1' data-tag='hidden'></span> <div data-text='l.i'></div> </div> <div>--data-foreach--</div> <div data-foreach='v.key3' data-foreach-key='arrKey' data-foreach-value='arrVal'> <span data-if='l.arrVal === "str2"' data-continue='1' data-tag='hidden'></span> <span data-if='l.arrVal === "str4"' data-break='1' data-tag='hidden'></span> <span data-text='l.arrKey'></span> <span>:</span> <span data-text='l.arrVal'></span> </div> <div>--data-while--</div> <script data-load-only='true'> l.whileCount = -1; </script> <div data-while='l.whileCount < 8'> <script data-load-only='true'> l.whileCount++; </script> <div data-if='l.whileCount === 3' data-continue='1' data-tag='hidden'></div> <div data-if='l.whileCount === 6' data-break='1' data-tag='hidden'></div> <div data-text='l.whileCount'></div> </div> <input data-name='sample2' type='text'> <div data-obj='obj2'></div>
loadStringTemplateではテンプレートを直接文字列で渡しましたが、loadTemplateを使うとテンプレートを別ファイルにできます
テンプレートはsrc/js/templates配下に拡張子htmlで作成します。これは、このフレームワークの規則です
loadTemplateの第二引数にsrc/js/templates配下のファイル名を与えます
src/js/templates配下にサブディレクトリを作成することもできます。その場合、loadTemplateの第二引数にはピリオド区切りで文字列を渡します
例えば、src/js/templates/sub/tpl.htmlを作成した場合、loadTemplateの第二引数には'sub.tpl'を渡します
loadTemplateではなく、appendLoadTemplateにすると、ボディ部を置換ではなく、ボディ部に追加します
loadTemplateではなく、beforeLoadTemplateにすると、ボディ部を置換ではなく、第一引数の直前に追加します
loadTemplateではなく、afterLoadTemplateにすると、ボディ部を置換ではなく、第一引数の直後に追加します
テンプレートのネスト
例
<script data-load-only='true'> l.nestVal = {'key1': '<input type="text">', 'key2': {'val1': 2}, 'key3': {"key1": "str1", "key2": "str2", "key3": "str3", "key4": "str4", "key5": "str5"}}; </script> <div data-template='tpl2' data-template-variable='l.nestVal'></div>
data-template属性値はloadTemplateの第二引数と同じです
data-template-variable属性値はloadTemplateの第三引数と同じです
data-template、data-template-variable属性が付いたタグの内部にテンプレートがロードされます
テンプレートに渡す変数をサーバーから受け取る。その1
これまでテンプレート内でvという変数名で使うことができる値をjsonで与えていましたが、これをサーバーから受信したjsonにすることができます
src/js/env/envValue.local.jsonを作成し、index.jsを下記に変更しましょう
{ "apiRoot" : "http://localhost:8080" }index.js
export class Index { constructor() { } sample_click(event) { $f.resJsonTemplate(this.obj, 'tpl', $f.envValue('apiRoot') + '/tpl.php', {'sample_key': 'sample_value'}) .then(this.success.bind(this)) .catch(this.error.bind(this)); } sample2_input(event) { this.obj2.textContent = event.target.value; } success(nodeList) { alert("success"); } error(exception) { alert("error"); console.error(exception); } }
tpl.phpを作成し、CORS設定したwebサーバーに配置してみましょう
CORS設定したwebサーバーはご自身で用意してください
ここでは例としてPHPでheaderメソッドを使いCORS設定します。PHPサーバーはhttp://localhost:8080とします
<?php header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Origin: http://localhost:8000"); header("Access-Control-Allow-Headers: Accept, Content-Type, X-Requested-With"); header("Content-Type: application/json; charset=UTF-8"); $rawRequest = file_get_contents("php://input"); $jsonRequest = json_decode($rawRequest, true); $responseJson = array( 'key1' => '<input type="text">', 'key2' => array( 'val1' => 2 ), 'key3' => array( "key1" => "str1", "key2" => "str2", "key3" => "str3", "key4" => "str4", "key5" => "str5" ), 'request_value' => $jsonRequest['sample_key'] ); echo json_encode($responseJson);
例としてPHPでjsonを返すサーバープログラムを示しました。これがドキュメントルート直下に設置されているとします
loadTemplateではなく、resJsonTemplateを使います
第二引数にsrc/js/templates配下のファイル名を与えます
第三引数にjsonを返すURLを与えます
第四引数にjsonを返すURLに送信するリクエストパラメーターを与えます
withCredentialsをtrueにしたい場合(cookieを送信したい場合)は第五引数にtrueを与えます
resJsonTemplateは第三引数で与えられたURLに第四引数に与えられたデータをPOST送信します。そのレスポンスのJSONをテンプレートに渡します
resJsonTemplateではなく、appendResJsonTemplateにすると、ボディ部を置換ではなく、ボディ部に追加します
resJsonTemplateではなく、beforeResJsonTemplateにすると、ボディ部を置換ではなく、第一引数の直前に追加します
resJsonTemplateではなく、afterResJsonTemplateにすると、ボディ部を置換ではなく、第一引数の直後に追加します
テンプレートに渡す変数をサーバーから受け取る。その2
先ほどはサーバーにjsonを送信しましたが、formを送信することもできます
index.js、index.html、tpl.phpを下記に変更しましょう
export class Index { constructor() { } sample_click(event) { $f.resJsonTemplateByForm(this.obj, 'tpl', $f.envValue('apiRoot') + '/tpl.php', this.sampleForm) .then(this.success.bind(this)) .catch(this.error.bind(this)); } sample2_input(event) { this.obj2.textContent = event.target.value; } success(nodeList) { alert("success"); } error(exception) { alert("error"); console.error(exception); } }index.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title> sample </title> <script id="fs-js" src="http://localhost:8000/js/fairysupport.min.js" data-page-root="http://localhost:8000/page"></script> </head> <body> <div data-obj="obj"></div> <div><button data-name="sample">sample</button></div> <div> <form data-obj="sampleForm"> <input name="sample_key" type="text" value="sample_value"> </form> </div> </body> </html>tpl.php
<?php header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Origin: http://localhost:8000"); header("Access-Control-Allow-Headers: Accept, Content-Type, X-Requested-With"); header("Content-Type: application/json; charset=UTF-8"); $responseJson = array( 'key1' => '<input type="text">', 'key2' => array( 'val1' => 2 ), 'key3' => array( "key1" => "str1", "key2" => "str2", "key3" => "str3", "key4" => "str4", "key5" => "str5" ), 'request_value' => $_REQUEST['sample_key'] ); echo json_encode($responseJson);
index.htmlにformタグを追加し、data-obj="sampleForm"を付けました
index.jsではresJsonTemplateではなく、resJsonTemplateByFormを使います
第四引数にjsonを返すURLに送信するformオブジェクトを与えます
withCredentialsをtrueにしたい場合(cookieを送信したい場合)は第五引数にtrueを与えます
resJsonTemplateByFormは第三引数で与えられたURLに第四引数に与えられたformをPOST送信します。そのレスポンスのJSONをテンプレートに渡します
resJsonTemplateByFormではなく、appendResJsonTemplateByFormにすると、ボディ部を置換ではなく、ボディ部に追加します
resJsonTemplateByFormではなく、beforeResJsonTemplateByFormにすると、ボディ部を置換ではなく、第一引数の直前に追加します
resJsonTemplateByFormではなく、afterResJsonTemplateByFormにすると、ボディ部を置換ではなく、第一引数の直後に追加します
テンプレートをサーバーから受け取る。その1
テンプレートを外部のサーバーから取得します
index.js、index.htmlを下記に変更しましょう
export class Index { constructor() { } sample_click(event) { $f.resHtmlTemplate(this.obj, $f.envValue('apiRoot') + '/tpl2.php', {'sample_key': 'sample_value'}, {'key1': '<input type="text">', 'key2': {'val1': 2}, 'key3': {"key1": "str1", "key2": "str2", "key3": "str3", "key4": "str4", "key5": "str5"}}) .then(this.success.bind(this)) .catch(this.error.bind(this)); } sample2_input(event) { this.obj2.textContent = event.target.value; } success(nodeList) { alert("success"); } error(exception) { alert("error"); console.error(exception); } }index.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title> sample </title> <script id="fs-js" src="http://localhost:8000/js/fairysupport.min.js" data-page-root="http://localhost:8000/page"></script> </head> <body> <div data-obj="obj"></div> <div><button data-name="sample">sample</button></div> </body> </html>
tpl2.phpを作成し、配置してみましょう
<?php header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Origin: http://localhost:8000"); header("Access-Control-Allow-Headers: Accept, Content-Type, X-Requested-With"); header("Content-Type: application/json; charset=UTF-8"); $rawRequest = file_get_contents("php://input"); $jsonRequest = json_decode($rawRequest, true); ?> <div>--requestData--</div> <div><?php echo htmlspecialchars($jsonRequest['sample_key'], ENT_QUOTES)?></div> <div>--data-text--</div> <div data-text='v.key1'></div> <div data-text='v.key1' data-tag='hidden'></div> <div>--data-html--</div> <div data-html='v.key1'></div> <div>--script--</div> <script data-load-only='true'> l.var = 1 + 2; </script> <div data-text='l.var'></div> <div>--data-attr--</div> <script data-load-only='true'> l.attr = {"style": "color: white; background-color: black;", "title" : "sample"}; </script> <div data-attr='l.attr'>data-attr</div> <div data-attr='{"style": "color: white; background-color: black;", "title" : "sample"}'>data-attr</div> <div>--data-prop--</div> <script data-load-only='true'> l.prop = {"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}; </script> <div data-prop='l.prop'>data-prop</div> <div data-prop='{"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}'>data-prop</div> <div>--data-if--</div> <div data-if='v.key2.val1 === 1'> v.key2.val1 === 1 </div> <div data-elseif='v.key2.val1 === 2'> v.key2.val1 === 2 </div> <div data-else=''> else </div> <div>--data-for--</div> <div data-for-start='l.i = 0' data-for-end='l.i < 10' data-for-step='l.i++'> <span data-if='l.i === 3' data-continue='1' data-tag='hidden'></span> <span data-if='l.i === 6' data-break='1' data-tag='hidden'></span> <div data-text='l.i'></div> </div> <div>--data-foreach--</div> <div data-foreach='v.key3' data-foreach-key='arrKey' data-foreach-value='arrVal'> <span data-if='l.arrVal === "str2"' data-continue='1' data-tag='hidden'></span> <span data-if='l.arrVal === "str4"' data-break='1' data-tag='hidden'></span> <span data-text='l.arrKey'></span> <span>:</span> <span data-text='l.arrVal'></span> </div> <div>--data-while--</div> <script data-load-only='true'> l.whileCount = -1; </script> <div data-while='l.whileCount < 8'> <script data-load-only='true'> l.whileCount++; </script> <div data-if='l.whileCount === 3' data-continue='1' data-tag='hidden'></div> <div data-if='l.whileCount === 6' data-break='1' data-tag='hidden'></div> <div data-text='l.whileCount'></div> </div> <input data-name='sample2' type='text'> <div data-obj='obj2'></div>
resHtmlTemplateを使います
第二引数にテンプレートを返すURLを与えます
第三引数にテンプレートを返すURLに送信するリクエストパラメーターを与えます
第四引数にテンプレート内でvという変数名で使うオブジェクトを渡します
withCredentialsをtrueにしたい場合(cookieを送信したい場合)は第五引数にtrueを与えます
resHtmlTemplateは第二引数で与えられたURLに第三引数に与えられたデータをPOST送信します。そのレスポンスをテンプレートにします
resHtmlTemplateではなく、appendResHtmlTemplateにすると、ボディ部を置換ではなく、ボディ部に追加します
resHtmlTemplateではなく、beforeResHtmlTemplateにすると、ボディ部を置換ではなく、第一引数の直前に追加します
resHtmlTemplateではなく、afterResHtmlTemplateにすると、ボディ部を置換ではなく、第一引数の直後に追加します
テンプレートをサーバーから受け取る。その2
先ほどはサーバーにjsonを送信しましたが、formを送信することもできます
index.js、index.html、tpl2.phpを下記に変更しましょう
export class Index { constructor() { } sample_click(event) { $f.resHtmlTemplateByForm(this.obj, $f.envValue('apiRoot') + '/tpl2.php', this.sampleForm, {'key1': '<input type="text">', 'key2': {'val1': 2}, 'key3': {"key1": "str1", "key2": "str2", "key3": "str3", "key4": "str4", "key5": "str5"}}) .then(this.success.bind(this)) .catch(this.error.bind(this)); } sample2_input(event) { this.obj2.textContent = event.target.value; } success(nodeList) { alert("success"); } error(exception) { alert("error"); console.error(exception); } }index.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title> sample </title> <script id="fs-js" src="http://localhost:8000/js/fairysupport.min.js" data-page-root="http://localhost:8000/page"></script> </head> <body> <div data-obj="obj"></div> <div><button data-name="sample">sample</button></div> <div> <form data-obj="sampleForm"> <input name="sample_key" type="text" value="sample_value"> </form> </div> </body> </html>tpl2.php
<?php header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Origin: http://localhost:8000"); header("Access-Control-Allow-Headers: Accept, Content-Type, X-Requested-With"); header("Content-Type: application/json; charset=UTF-8"); ?> <div>--requestData--</div> <div><?php echo htmlspecialchars($_REQUEST['sample_key'], ENT_QUOTES)?></div> <div>--data-text--</div> <div data-text='v.key1'></div> <div data-text='v.key1' data-tag='hidden'></div> <div>--data-html--</div> <div data-html='v.key1'></div> <div>--script--</div> <script data-load-only='true'> l.var = 1 + 2; </script> <div data-text='l.var'></div> <div>--data-attr--</div> <script data-load-only='true'> l.attr = {"style": "color: white; background-color: black;", "title" : "sample"}; </script> <div data-attr='l.attr'>data-attr</div> <div data-attr='{"style": "color: white; background-color: black;", "title" : "sample"}'>data-attr</div> <div>--data-prop--</div> <script data-load-only='true'> l.prop = {"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}; </script> <div data-prop='l.prop'>data-prop</div> <div data-prop='{"style": {"color" : "white", "backgroundColor": "black"}, "title" : "sample"}'>data-prop</div> <div>--data-if--</div> <div data-if='v.key2.val1 === 1'> v.key2.val1 === 1 </div> <div data-elseif='v.key2.val1 === 2'> v.key2.val1 === 2 </div> <div data-else=''> else </div> <div>--data-for--</div> <div data-for-start='l.i = 0' data-for-end='l.i < 10' data-for-step='l.i++'> <span data-if='l.i === 3' data-continue='1' data-tag='hidden'></span> <span data-if='l.i === 6' data-break='1' data-tag='hidden'></span> <div data-text='l.i'></div> </div> <div>--data-foreach--</div> <div data-foreach='v.key3' data-foreach-key='arrKey' data-foreach-value='arrVal'> <span data-if='l.arrVal === "str2"' data-continue='1' data-tag='hidden'></span> <span data-if='l.arrVal === "str4"' data-break='1' data-tag='hidden'></span> <span data-text='l.arrKey'></span> <span>:</span> <span data-text='l.arrVal'></span> </div> <div>--data-while--</div> <script data-load-only='true'> l.whileCount = -1; </script> <div data-while='l.whileCount < 8'> <script data-load-only='true'> l.whileCount++; </script> <div data-if='l.whileCount === 3' data-continue='1' data-tag='hidden'></div> <div data-if='l.whileCount === 6' data-break='1' data-tag='hidden'></div> <div data-text='l.whileCount'></div> </div> <input data-name='sample2' type='text'> <div data-obj='obj2'></div>
index.htmlにformタグを追加し、data-obj="sampleForm"を付けました
index.jsではresHtmlTemplateではなく、resHtmlTemplateByFormを使います
第三引数にテンプレートを返すURLに送信するformオブジェクトを与えます
第四引数にテンプレート内でvという変数名で使うオブジェクトを渡します
withCredentialsをtrueにしたい場合(cookieを送信したい場合)は第五引数にtrueを与えます
resHtmlTemplateByFormは第二引数で与えられたURLに第三引数に与えられたformをPOST送信します。そのレスポンスをテンプレートとします
resHtmlTemplateByFormではなく、appendResHtmlTemplateByFormにすると、ボディ部を置換ではなく、ボディ部に追加します
resHtmlTemplateByFormではなく、beforeResHtmlTemplateByFormにすると、ボディ部を置換ではなく、第一引数の直前に追加します
resHtmlTemplateByFormではなく、afterResHtmlTemplateByFormにすると、ボディ部を置換ではなく、第一引数の直後に追加します
画面に表示されているDOMをテンプレートとして使う
index.js、index.htmlを下記に変更しましょう
export class Index { constructor() { } init() { $f.useDomAsTemplate(this.obj, {'key': {'val1': 2}}) .then(this.success.bind(this)) .catch(this.error.bind(this)); } success(nodeList) { this.obj.style.display = "block"; } error(exception) { alert("error"); console.error(exception); } }index.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title> sample </title> <script id="fs-js" src="http://localhost:8000/js/fairysupport.min.js" data-page-root="http://localhost:8000/page"></script> </head> <body> <div data-obj="obj" style="display:none"> <div data-if='v.key.val1 === 1'> v.key.val1 === 1 </div> <div data-elseif='v.key.val1 === 2'> v.key.val1 === 2 </div> <div data-else=''> else </div> </div> </body> </html>
index.jsではuseDomAsTemplateを使います
第一引数に与えたDOM配下をテンプレートとして扱います
第二引数にテンプレート内でvという変数名で使うオブジェクトを渡します