LoginSignup
1
1

More than 5 years have passed since last update.

Handlebars の each 内の コンテキスト

Posted at

Handlebars と Assemble

Handlebars

いわずもがな js テンプレート, これ自体をあんましチョイスすることはあるのだろうか

Assemble

Handle bars を使用した 静的テンプレートエンジン。
grunt で動く。 gulp はまだ開発段階。
middleman とは使い勝手も違うが、node 製なので 軽く動く。
やりたいことさえ明確なら、assemble の方が嬉しいこともあるかもしれない。

each とそのコンテキスト

Handlebars には each という機能がある。
hoge.json とかに対して、ブン回す。よくある機能だね。

例えばのファイルを定義しておこう

hoge.json
{
    "list":[
        {
            "val1": "a",
            "val2": "b",
        },
        {
            "val1": "a",
            "val2": "b",
        },
        {
            "val1": "a",
            "val2": "b",
        },
        ...

    ]  
}

hobe.josn

each 中のコンテキスト

これは、 hoge.json に対して向いている。
このとき、this を用いることができる。

{{#each hoge.json}}

    {{this.val1}}

{{/each}}

とか書けば。

a
a
a
...

と出力される。まぁ正しい。

コンテキストって何

ここでいうコンテキストっていうのはなんだろうか?
ここまでコンテキストといってなんだが、実際は Path のことである。

コンテキスト = path であることを理解しておくと何が重要か

さて先ほどのeach 実行中に別のファイル hoge2.jsonを参照したくなった。

hoge2.json を定義しよう。

hoge2.json
{
    "val1": "hogehoge"
}

ここで 以下を実行する

{{#each hoge.json}}

    {{this.val1}}

    {{hoge2.val1}}

{{/each}}

さて実行結果は

a
a
a
...

となる。
hogehoge はでてこず(ちなみにエラーがでない!なんてっこった。。。)
ちなみに私の実行環境は assemble 内であるあしからず。

なぜ hogehoge がでないかといえば、現在の コンテキストが、hoge.json を向いているからである。

へー。。。じゃあどうすればいいんだい?
handlebarsはキモいことに 相対的なパスを用いて、コンテキストの解決ができる。

{{#each hoge.json}}

    {{this.val1}}

    {{../hoge2.val1}}

{{/each}}

こうすることで期待している

a
hogehoge
a
hogehoge
a
hogehoge
...

が得られるわけである。
こんなのは、公式のリファレンスを読めば解決するのだが、なんだってー感が強かったので、
忘れないために文章化した。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1