Есть ли перехватчик повторного кадра, например путь, который принимает дополнительный динамический идентификатор?

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

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

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

Или, может быть, я просто пишу использовать reg-event-ctx и обрабатываю все вручную?

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


person kennytilton    schedule 10.06.2018    source источник
comment
После рассмотрения варианта использования общения с внешним сервером [1], и в этом случае динамическая специфичность обработки события проста, мне кажется, мне просто нужно эмулировать эту версию 1 примера, возможно, написав собственный обработчик для localStorage, если это кажется полезно обобщается для поддержки версии 2. [1] github.com/Day8/re-frame/blob/develop/docs/   -  person kennytilton    schedule 11.06.2018


Ответы (1)


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

(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)))))))

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

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

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