Существует ли перехватчик кадров, например, «путь», который принимает дополнительный динамический идентификатор? - PullRequest
0 голосов
/ 11 июня 2018

Справочная информация. Пример re-frame todomvc, как и большинство реализаций, хранит все задачи в виде одного большого двоичного объекта в локальном хранилище.Это означает, что события, изменяющие задачу, могут иметь перехватчик пути для пути с жестким кодом [: todos], а затем перехватчик -> localStorage слепо записывает «все» в ключ задачи, уверенный, что «все» - это просто задачи.

Проблема: что, если у меня почти такой же сценарий, но для эффективности я хочу сохранить каждую задачу под другим ключом, (1) назначив, скажем, UUID, затем (2) создав ключ как «TODO-"+ uuid?Тогда вектор события будет содержать uuid изменяемой задачи.

I думаю Мне просто нужен перехватчик типа «путь», который может каким-то образом посмотреть на событие, чтобы определить uuid и узкий"db" - только для этого todo, а затем есть перехватчик писателя, который понимает, как получить ключевую информацию из контекста.Существует ли такое существо?

Или, может быть, я просто пишу, используя reg-event-ctx и пользовательский дескриптор всего?

Или мне не хватает более идиоматического решения?

1 Ответ

0 голосов
/ 20 июля 2018

Я столкнулся с такой проблемой в одном из моих проектов.Вот решение, которое я придумала:

(require '[re-frame.interceptor :refer [->interceptor get-effect get-coeffect assoc-coeffect assoc-effect]])

(defn path-by [path-key event->path]
  (->interceptor
    :id ::path-by

    :before
    (fn
      [context]
      (let [original-db  (get-coeffect context :db)
            event        (get-coeffect context :event)
            path         (or (event->path event)
                             (path-key original-db))
            original-db' (assoc original-db path-key path)]
        (assert (some? path)
                "Cannon get path neither from event->path nor from db.")
        (-> context
            (assoc ::original-db original-db')
            (assoc-coeffect :db (get-in original-db' path)))))

    :after
    (fn [context]
      (let [original-db (::original-db context)
            path        (path-key original-db)
            context'    (-> (dissoc context ::original-db)
                            (assoc-coeffect :db original-db))
            db          (get-effect context :db ::not-found)]
        (if (= db ::not-found)
          context'
          (->> (assoc-in original-db path db)
               (assoc-effect context' :db)))))))

Большая часть его заимствована из оригинального перехватчика path перекадра.

Вот пример использования:

(rf/reg-event-fx ::taks-viewed
  (path-by
    ::current-task
    (fn [[_ id]] id))
  (fn [{:keys [db]} [_ id]]
    {:db   (assoc db :loading true)
     :http {...}}))
...