【问题标题】:How to filter a list based on user input with ClojureScript and Om?如何使用 ClojureScript 和 Om 根据用户输入过滤列表?
【发布时间】:2014-04-20 07:54:05
【问题描述】:

我刚开始使用 Om(一个基于 reactjs 的 ClojureScript 库)。我想根据用户输入过滤列表。以下工作,但解决方案似乎很复杂。有更好的吗?

(ns om-tut.core
  (:require-macros [cljs.core.async.macros :refer [go]])
  (:require [om.core :as om :include-macros true]
            [om.dom :as dom :include-macros true]
            [clojure.string :as string]))

(enable-console-print!)

(def app-state (atom {:list ["Lion" "Zebra" "Buffalo" "Antelope"]}))

(defn handle-change [e owner {:keys [text]}]
  (om/set-state! owner :data (vec (filter (fn [x] (> (.indexOf x(.. e -target -value)) -1)) (@app_state :list))))
  (om/set-state! owner :text (.. e -target -value)))


(defn list-view [app owner]
  (reify
    om/IInitState
    (init-state [_]
      {:text nil
       :data (:list app)
       })
    om/IRenderState
    (render-state [this state]    
      (dom/div nil
        (apply dom/ul #js {:className "animals"}
          (dom/input 
            #js {:type "text" :ref "animal" :value (:text state)
                 :onChange #(handle-change % owner state)})               
          (map (fn [text] (dom/li nil text)) (:data state)))))))


(om/root list-view app-state
  {:target (. js/document (getElementById "registry"))})

【问题讨论】:

    标签: clojure clojurescript reactjs om


    【解决方案1】:

    我认为这是一个更好的解决方案:

    (ns om-tut.core
      (:require-macros [cljs.core.async.macros :refer [go]])
      (:require [om.core :as om :include-macros true]
                [om.dom :as dom :include-macros true]))
    
    (def app-state (atom {:list ["Lion" "Zebra" "Buffalo" "Antelope"]}))
    
    (defn handle-change [e owner {:keys [text]}]
      (om/set-state! owner :text (.. e -target -value)))
    
    (defn list-data [alist filter-text]
     (filter (fn [x] (if (nil? filter-text) true
                         (> (.indexOf x filter-text) -1))) alist))
    
    (defn list-view [app owner]
      (reify
        om/IInitState
        (init-state [_]
          {:text nil})
        om/IRenderState
        (render-state [this state]
          (dom/div nil
            (apply dom/ul #js {:className "animals"}
              (dom/input
                #js {:type "text" :ref "animal" :value (:text state)
                     :onChange (fn [event] (handle-change event owner state))})
                (map (fn [text] (dom/li nil text)) (list-data (:list app) (:text state)))))))) 
    
    (om/root list-view app-state
      {:target (. js/document (getElementById "animals"))})
    

    【讨论】:

    • 我认为list-data 应该不区分大小写。 (defn list-data [alist filter-text] (filter #(re-find (js/RegExp. filter-text "i") %) alist)) 当你寻找 "a" 时,你会得到:("Zebra" "Buffalo" "Antelope") 来源:stackoverflow.com/questions/23186490/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2011-08-30
    • 2015-10-15
    • 2021-01-18
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多