Riotのタグに値を渡すにはいくつかの方法がありますが、JSONを渡そうとして少し引っかかりました。
おことわり
あらかじめコメントしますが、本来あまりよろしくない使い方だ、というのはよく承知しています。できれば、別な手段を使ってください。
Riotへの値の渡し方
Riotのタグに必要な値を供給するには、大きく分けて3つの方法があります。
- タグ内部に書いたコードから(APIなどを叩いて)直接取ってくる
- RiotをマウントしたJavaScriptコードから、タグインスタンスに値を直接渡す
- タグに属性として書いておく
なお、カスタムタグ同士をネストする場合は、attr={value}
のように書けば、JavaScriptの変数として値も渡されるようになっています。
外側から渡そうとして失敗
PHPで書いていた周辺のプログラムとの関係もあって、カスタムタグの引数にJSONを渡したくなりました。ところが、受け取ったデータは渡したものといても似つかぬものとなっていました。
JSONで渡せる値の種類
JSONには、以下の種類の値があります。
- 文字列(
"String"
) - 数値(
5.8
) -
true
・false
・null
- 配列(
[]
) - 連想配列(
{}
)
Riotに渡したときにうまく動かなくなったのは、連想配列でした。
原因が判明
Riot.jsには、条件のかかるクラス名をclass={foo: true, bar: false}
のような形で簡潔に書けるようにする構文がありますが、これが外部から渡したJSONにも効いてしまった、というのが真相でした。
とりあえず、外から渡すときに余計な文字を先頭に追加して中カッコのパースを避けて、それからタグ内で余計な文字を除去してJSON.parse
とすることで、回避はできるようになりました。