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 ответа
Не уверен, что это правильный путь, но я решил эту проблему.
- Оформить заказ из GitHub. ( https://github.com/omcljs/om)
- cd om
- Lein Install
Теперь последний ом доступен в вашей системе. (Вы не можете просто поместить его в файл своего проекта, потому что его пока нет на https://clojars.org/repo/).
- Теперь я думаю, что за меня произошла путаница. Ранее в руководстве, перед примером автокоррекции; есть файл проекта, который определяется с
[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])))))