2

hamlアンダースコアテンプレートでjavascriptを挿入すると奇妙なエラーが発生する

これは完璧に機能します:

.button{ :id => "<%= 'class_name' %>" }

これはエラーになります

.button{ :class => "<%= 'class_name' %>" }

唯一の違いは、idの代わりにclassを使用することです。

javascriptエラー:

Uncaught SyntaxError: Unexpected identifier 

アップデート:

<%=%>は、アンダースコアテンプレートエンジンから取得されます。ですから、それはerbやその他の種類のものではありません。hamlの生成中にエラーは発生しませんが、javascriptでエラーが発生します。

4

2 に答える 2

4

与えられたものが機能しているので、falseに設定し、場合によってはに設定したと.button{ :id => "<%= 'class_name' %>" }仮定します。これにより、次の出力が生成されます。:escape_attrs:attr_wrapper"

<div class="button" id="<%= 'class_name' %>"></div>

問題を引き起こしているビットは、次のようになります.button{ :class => "<%= 'class_name' %>" }

<div class="%> 'class_name' <%= button"></div>

この問題は、Hamlが構文( )のclass要素を属性ハッシュ()のクラスエントリの内容と組み合わせるときに発生します。Hamlは後者をスペースで区切られたリストとして扱い、要素を追加してから、結果の配列を並べ替えて、表示される出力を生成します。(このようにリストをスペースで区切られたリストとして扱うことは、「純粋な」HTMLには意味がありますが、javascriptフレームワークがこのように使用すると機能しなくなります。並べ替えの理由は、Hamlのテストスイートのクラスエントリの一貫した順序を提供するためです。).button<%= 'class_name' %>button

回避策は、.構文と:class属性ハッシュのエントリを一緒に使用しないことです。classエントリを使用するだけです。

%div{ :class => "button <%= 'class_name' %>" }

生成:

<div class="button <%= 'class_name' %>"></div> 

(すでに発見した)別の回避策は、アンダースコアテンプレートからスペースを削除することです。これにより、Hamlはそれを単一のエンティティとして扱い、分割しません。

于 2012-09-11T17:13:25.693 に答える
0

これはうまくいくはずです

.button{:class => "#{class_name}"}
于 2012-09-11T12:44:53.137 に答える