Om-next Учебное пособие по удаленной синхронизации send-to-chan

Возможно, я делаю что-то не так, но я считаю, что у одного из следующих руководств есть некоторые проблемы; в частности, пример автозаполнения. Мне удалось выяснить одну из проблем, но есть еще одна проблема, которая вызывает у меня некоторые проблемы.

Как только я вставил более двух букв в поле ввода для автозаполнения, следующий код:

(defn send-to-chan [c]
  (fn [{:keys [search]} cb]
    (when search
      (let [{[search] :children} (om/query->ast search)
            query (get-in search [:params :query])]
        (put! c [query cb])))))

выдает следующую ошибку:

Uncaught TypeError: Cannot read property 'call' of undefined
core.js?zx=3jufl8vymlgw [452]   om_tutorial.core.send_to_chan
next.js [3034]  om.next.Reconciler.om$next$protocols$IReconciler$send_BANG_$arity$1
protocols.js [303]  om$next$protocols$send_BANG_
next.js [1656]  anonymous

Я не уверен, почему это так.

Любая помощь будет принята с благодарностью.

3 ответа

Решение

Не уверен, что это правильный путь, но я решил эту проблему.

  1. Оформить заказ из GitHub. ( https://github.com/omcljs/om)
  2. cd om
  3. Lein Install

Теперь последний ом доступен в вашей системе. (Вы не можете просто поместить его в файл своего проекта, потому что его пока нет на https://clojars.org/repo/).

  1. Теперь я думаю, что за меня произошла путаница. Ранее в руководстве, перед примером автокоррекции; есть файл проекта, который определяется с [org.omcljs/om "1.0.0-alpha23"], Затем, когда появился пример автокоррекции, я использовал те же конфигурации проекта, так как не было упоминания о том, как снова настроить файл проекта. Оказывается, вы должны использовать[org.omcljs/om "1.0.0-alpha29"],

Как только это происходит, все работает, хотя я получаю следующее предупреждение.

Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `om_tutorial$core$AutoCompleter`. See https://fb.me/react-warning-keys for more information.

Это будет борьба за другой день.

КСТАТИ. Поскольку я изначально использовал старую версию om, просто установка новой не решила проблему. lein clean тоже не решил проблему. Я должен был вручную удалить мой om-tutorial/resources/public/js папка. Тогда беги lein run -m clojure.main script/figwheel.clj,

Ошибка каждого дочернего массива, требующего "ключевого" свойства, больше связана с React, чем с Om. React требует, чтобы у каждого подкомпонента был уникальный идентификатор.

Если вы перебираете фабричный метод, он не будет автоматически генерировать новый идентификатор для каждого подкомпонента. Вы должны указать ключевую функцию:

(def app-state 
  (atom {:items [{:id 1
                  :title "Foo"}
                 {:id 2
                  :title "Foo"}]}

(defui Item
 static om/IQuery
 (query [this] [:id :title])
 Object
 (render [this]
   (dom/li nil (:title (om/props this))))

;; Specify key function as follows
(def item (om/factory Item {:keyfn :id})

(defui List
 static om/IQuery
 (query [this] [{:items (om/get-query Item)}])
 Object 
 (render [this]
   (dom/ul nil (map item (:items (om/props this)))))

Функция ключа не должна возвращать число, но она должна возвращать какую-то уникально идентифицирующую часть информации для каждого итерируемого элемента (что в данном случае является заголовком).

Кстати, вы также можете использовать map-indexed чтобы сгенерировать число для подачи в функцию ключа или использовать генератор случайных чисел.

Я думаю, что проблема в om.next/query->ast не определена в 1.0.0-alpha23 - это было источником вызова неопределенной ошибки.

Вот хакерский обходной путь:

    (defn send-to-chan [c]
      (fn [{:keys [search] :as x} cb]
        (when search ;; e.g. [(:search/results {:query "xxx"})]
          (let [query (-> search first second :query)]
            (put! c [query cb])))))
Другие вопросы по тегам