jqueryのプラグインとして、htmlにjsonデータを突っ込めるコードを書いた。
ただし、いま流行りのリアクティブ感は一切なく、実行したタイミングでviewに反映して終わり、というすごーく限定的なシロモノとなっているので注意。
https://github.com/yosiopp/jquery-viewbinder
目的
htmlは基本的に静的で、一部APIのレスポンスjsonの内容を画面に表示したい、というシンプルな要件があり、大仰なSPAアプリにはしたくない、というときに、jQueryを使ってちゃちゃっと作りたいところだけど、とはいえDOMを自分で弄るのは面倒だし、html構造の変更にも弱くなるからなあ。htmlを弄ってもちゃんと意図したところに反映されてほしいよなー。
なんていう場合に、
Angular1のng-bindみたいにデータが特定要素に展開されてくれたら嬉しいな、という目的で作成しました。
なので、データのリアルタイム反映なんていらないのです。
やりたいことは、htmlに文字列を埋めることだけ。 (なので、データバインディングという表現だと大袈裟なのかも…)
使い方
$("body").viewbinder(object);
<span data-vmap="key" data-vpath="jsonpath"></span>
データを埋めたい要素にdata-vmap, data-vpath属性を指定します。
data-vmapにはobjectのキー名を指定します。
data-vpathにはobjectルートから目的のデータまでのjsonpathを指定します。
$(()=>{
$("body").viewbinder({
hoge: {name:"yosiopp"},
fuga: {name:"john"}
});
})
<span data-vmap="hoge" data-vpath="name"></span>
上記は、以下のようにレンダリングされます。
<span>yosiopp</span>
data-vmapを省略した場合、viewbinder()に渡されたobject自身が指定されたものとみなします。
なので、以下のようにも書くことができます。
<span data-vpath="$.hoge.name"></span>
data-vmapが#で始まる文字列の場合、localStorageから該当するエントリをgetItemし、JSON.parseして利用します。 つまり、以下はだいたい同じです。
$(()=>{
$("body").viewbinder();
})
<span data-vmap="#local" data-vpath="$.items[0].name"></span>
$(()=>{
$("body").viewbinder(JSON.parse(localStorage.getItem("local")));
})
<span data-vpath="$.items[0].name"></span>
同様に、%で始まる文字列の場合はsessionStorageのエントリから探します。
ちなみにjsonPathを利用するためには
https://code.google.com/archive/p/jsonpath/
を利用する必要があります。
自分のために作ったものですが、要件に合うようでしたらご利用ください。