我有一个生成<select>
标签的嵌套循环,我想将它们设置为某个值。
我以为我可以创建一个lambda {{selected}}
来获取上下文并检查它是否是此selectbox的正确值。除了我还需要{{team}}
数组中的id。
对于单个选择,您可以在selected
中包含champions
布尔值,但这会使得快速选择框变得混乱。
是否有办法获取所需信息或其他方式来生成selected
属性?我使用Clojure的Stencil,数据看起来像这样:
{:params {"winner0" 16, "winner1" 4, ...}
:champions [{:name "Soraka", :id 16}, ...]
:team (range 5)
:selected (fn [] if params[idx] == champion-id: return selected)}
HTML摘录:
<form method="get" action="">
{{#team}}
<select name="winner{{.}}">
<option value="">None</option>
{{#champions}}
<option {{selected}} value="{{id}}">{{name}}</option>
{{/champions}}
</select>
{{/team}}
<input type="submit" value="Recommend my pick!" />
</form>
答案 0 :(得分:2)
小胡子模板应该是“哑巴”。即使存在lambda构造,它的能力也非常有限。您最好的选择是转换数据,使其已经为模板“按摩”。 Clojure在这里闪耀:它具有非常强大的数据转换原语。
这是一个基于你的例子(为简洁而简化):
(require '[stencil.core :as stencil])
(def form "{{#teams}}
<select name='winner{{id}}'>
<option value=''>None</option>
{{#champions}}
<option {{#selected}}selected='selected' {{/selected}}value='{{id}}'>{{name}}</option>
{{/champions}}
</select>
{{/teams}}")
(let [data {:params {"winner0" 16, "winner1" 4}
:champions [{:name "Soraka", :id 16}
{:name "champ4" :id 4}
{:name "champ5" :id 5}]}]
(->> (range 2)
(map (fn [team-id]
(let [winner (get (:params data) (str "winner" team-id))]
{:id team-id
:champions (map #(assoc % :selected (= (:id %) winner))
(:champions data))})))
(hash-map :teams)
(stencil/render-string form))
结果:
<select name='winner0'>
<option value=''>None</option>
<option selected='selected' value='16'>Soraka</option>
<option value='4'>champ4</option>
<option value='5'>champ5</option>
</select>
<select name='winner1'>
<option value=''>None</option>
<option value='16'>Soraka</option>
<option selected='selected' value='4'>champ4</option>
<option value='5'>champ5</option>
</select>
即使这似乎做你需要的,如果你有机会选择我强烈建议使用像hiccup这样的东西。它是使用clojure数据结构表示html的DSL,因此它非常具有表现力和强大功能。