У меня есть компонент выбора, который показывает метку и связанные параметры. Существует отдельный «язык» для выбора языка дисплея. При изменении он обновляет как @language
, который выбирает язык меток, так и @search-language-options
, который предоставляет параметры для выбора. Ярлык обновляется, как ожидалось, но список опций не обновляется - он остается в исходном состоянии.
;; search-languages -> vector
;; return the languages referenced in the data for options use
(defn search-languages []
(let [options (list (tr {:dict ld} [@language :en] [:choice-any]))]
(if (= @language :or) (concat options (vec (set (map (partial get-field "lang") parsed-json))))
(concat options (vec (set (map (partial get-field "langTranslated") parsed-json)))))))
(def search-language-options (r/atom (search-languages)))
;; filter component -> component
;; create a select
(defn select-filter-component [label value options]
[:div {:class "form-group"}
[:label {:class "control-label" :for label} label]
[:select {:id label :class "form-control" :value @value :on-change #(reset! value (-> % .-target .-value))}
(for [opt options]
^{:key opt} [:option {:value opt} opt])]])
;; lang-select -> component
;; choose display language
(defn lang-select []
[:div {:class "form-control" }
[:select {:id :en :value @language :on-change (fn [e]
(reset! language (.. e -target -value))
(reset! search-language-options (search-languages)))
}
^{:key :en} [:option {:value :en} "English"]
^{:key :fr} [:option {:value :fr} "Français"]
^{:key :es} [:option {:value :es} "Español"]
^{:key :or} [:option {:value :or} "Original language"]
]])
;; filter form
;; filter the results
(defn filter-form []
[:form {:class "form-inline"}
[search-filter-component (tr {:dict ld} [@language :en] [:search] ) search-text]
[select-filter-component (tr {:dict ld} [@language :en] [:language] ) search-language @search-language-options]
[select-filter-component (tr {:dict ld} [@language :en] [:gender] ) gender ["Any" "M" "F"]]
[select-filter-component (tr {:dict ld} [@language :en] [:continent/title] ) continent ["Any" "Europe"]]
[select-filter-component (tr {:dict ld} [@language :en] [:country] ) placeTranslated ["Any" "Austria" "Switzerland" "Germany"]]
[select-filter-component (tr {:dict ld} [@language :en] [:literaryForm] ) literaryForm ["Any" "Drama" "Poetry" "Prose: fiction" "Prose: non-fiction" ]]
[select-filter-component (tr {:dict ld} [@language :en] [:genre] ) genre ["Any" "Short story" "Novella" "Graphic Novel"]]
[reset-button]]
)