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という変数名で使うオブジェクトを渡します