Возникли проблемы с реагентом и атомом! функция - PullRequest
0 голосов
/ 29 апреля 2020

Привет, ребята, я новичок в Clojure и ClojureScript ...

Я заполняю 2 элемента выбора ... Что я хочу сделать, это обновить второй выбор в зависимости от того, какой вариант пользователь выбирает в первый выбор.

Это мой код:

(ns easy-recipe.components.calculate
  (:require [reagent.core :as r :refer [atom]]
            [ajax.core :as ajax]
            [reagent.session :as session]
            [easy-recipe.components.common :refer [input select button]]
            [easy-recipe.bulma.core :refer [horizontal-select horizontal-input-has-addons table columns box]]))


(defn handler [request]
  (session/put! :categories (get-in request [:body :categories]))
  (session/put! :breads (get-in request [:body :breads]))
  (session/put! :recipes (get-in request [:body :recipes])))

(defn error-hadler [request]
  (let [errors {:server-error (get-in request [:body :erros])}]
    errors))

(defn get-categories-breads-recipes []
  (ajax/GET "/api/calculate"
            {:handler handler
             :error-hadler error-hadler}))

(defn select-fun-wrapper [breads]
  (fn [e]
    (let [category_value (-> e .-target .-value)]
      (reset! breads
              (filter
               #(= category_value (str (% :category_id)))
               (session/get :breads))))))

(defn calculate-page []
  (get-categories-breads-recipes)
  (let [fields (atom {})
        categories (atom nil)
        breads (atom nil)
        recipe (atom nil)]
    (fn []
      (reset! categories (session/get :categories))
      ;(reset! breads (filter #(= 1 (% :category_id)) (session/get :breads)))
      [:div.container
       [box
        [horizontal-select "Category"
         [select "category" "select" @categories (select-fun-wrapper breads)]]
        [horizontal-select "Bread"
         [select "bread" "select" @breads #()]]
        [horizontal-input-has-addons "Quantity"
         [input "quantity" "input" :text "" fields]
         [button "quantity-btn" "button" "Add" #() nil]]]
       [box
        [columns
         [table ["Ingredients" "Quantity"] @recipe]
         [table ["Product" " "] [["30 Panes" "x"]]]]]])))


Как вы заметили, сброс хлеба! прокомментировано ... теперь "select-fun-wrapper" работает нормально, он обновляет выбор хлеба в зависимости от выбранной опции категории ... но если я раскомментирую эту строку, "select-fun-wrapper" перестанет работать ( не обновляет второй выбор) ... Я не знаю, почему он произошел?

Я не могу оставить эту строку с комментариями, потому что сейчас у меня проблема с запуском выбора "Хлеб" empthy ... Как я мог заполнить атом хлеба, не используя перезагрузку! функция?

Дополнительный код (если он прояснит):

(ns easy-recipe.bulma.core)

(defn horizontal-select [label select]
  [:div.field.is-horizontal
   [:div.field-label.is-normal>label.label label]
   [:div.field-body>div.field.is-narrow>div.control>div.select.is-fullwidth
    select]])

....
(ns easy-recipe.components.common)

(defn select [id class options function]
  [:select {:id id :class class :on-change function}
   (for [opt options]
     ^{:key (opt :id)}
     [:option {:value (opt :id)} (opt :name)])])

....
...