如何在胡子的嵌套循环中的选择框中选择正确的选项?

时间:2015-07-27 20:39:54

标签: clojure mustache

我有一个生成<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>

1 个答案:

答案 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,因此它非常具有表现力和强大功能。