Om-next远程同步教程send-to-chan

时间:2016-01-05 03:18:25

标签: clojure autocomplete clojurescript om

我可能做错了,但我相信其中一个om-next tutorials有一些问题;特别是自动完成示例。我能够弄明白one of the issues,但还有另一个问题导致我遇到了一些问题。

一旦我在输入框中输入了两个以上的字母以进行自动完成,请输入以下代码:

(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 个答案:

答案 0 :(得分:2)

不确定这是否是正确的做事方式,但这就是我为解决这个问题所做的工作。

  1. 从github查看。 (https://github.com/omcljs/om
  2. cd om
  3. lein install
  4. 现在您的系统上可以使用最新的om。 (你不能只把它放在你的项目文件中,因为它还没有在https://clojars.org/repo/上)。

    1. 现在这就是我认为混乱发生在我身上的地方。早些时候 教程,在自动修正示例之前;有一个项目文件 用[org.omcljs/om "1.0.0-alpha23"]定义。然后当 自动修正示例出现了,我使用了同一个项目 配置,因为没有提到如何配置 再次项目文件。事实证明你必须使用 [org.omcljs/om "1.0.0-alpha29"]
    2. 一旦发生这一切,虽然我收到以下警告,但一切正常。

      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

答案 1 :(得分:0)

每个子数组的错误需要"键"道具与React的关系比Om更多。 React要求每个子组件都具有唯一的ID。

如果迭代工厂方法,它不会自动为每个子组件生成新的id。您必须指定一个关键功能:

(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生成一个数字以输入关键功能,或者使用随机数生成器。

答案 2 :(得分:0)

我认为问题是om.next/query->ast未在1.0.0-alpha23中定义 - 这是未定义错误调用的来源。

这是一个hacky work-around:

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