Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure Om下一个远程同步教程发送给chan_Clojure_Autocomplete_Clojurescript_Om - Fatal编程技术网

Clojure Om下一个远程同步教程发送给chan

Clojure Om下一个远程同步教程发送给chan,clojure,autocomplete,clojurescript,om,Clojure,Autocomplete,Clojurescript,Om,我可能做错了什么,但我相信其中一个有一些问题;特别是自动完成的例子。我能弄明白,但还有另一个问题给我带来了一些问题 一旦我在输入框中输入两个以上的字母进行自动补全,以下代码: (defn send-to-chan [c] (fn [{:keys [search]} cb] (when search (let [{[search] :children} (om/query->ast search) query (get-in search [:

我可能做错了什么,但我相信其中一个有一些问题;特别是自动完成的例子。我能弄明白,但还有另一个问题给我带来了一些问题

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

(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
我不知道为什么会这样


任何帮助都将不胜感激。

不确定这是否是正确的方法,但这就是我为解决这个问题所做的

  • 从github签出om。()
  • 光盘
  • 莱因安装
  • 现在,您的系统上提供了最新的om。(您不能只将其放在项目文件中,因为它尚未启用)

  • 我想这就是我困惑的地方。早些时候 教程,在自动校正示例之前;有一个项目文件 这是通过
    [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

    关于每个需要“key”道具的子数组的错误与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)))))
    
    key函数不必返回一个数字,但它必须为迭代的每个项返回某种唯一标识的信息(在本例中,标题不是)


    顺便说一句,您也可以使用
    映射索引
    生成一个数字以输入键函数,或者使用随机数生成器。

    我认为问题在于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])))))
    

    你可能会在om next的很多开发上有更好的运气,因为它仍然是alpha之前的软件,所以它是实验性的。是的,这就是我读到的。我在Slack和IRC上发了帖子,但没有人回复或说任何关于它的事情。我本来打算在我的帖子中提到的github链接上发表文章,因为这有助于我的第一期文章,但他们基本上说了同样的话,关于Slack。当你试图学习时,你会非常沮丧。我想我会更深入地研究om下一个源代码(不管怎样,我已经做了一段时间了),并试图弄清楚到底发生了什么。谢谢。把它当作一种全新的语言,有自己的原语和规则。我也想弄明白,这是一种思维扭曲,你不可能在几周内像大卫·诺伦那样。真的,真的。我只是在想“官方”教程实际上是可行的。哈哈。@user2517182他们没有。他们还没有更新,我知道这不是一个高优先级的时刻。谢谢!我仍然掌握着这一切的诀窍。我将尝试在教程代码中实现这些信息,并看看它是如何运行的。嗨,在我的例子中,我在升级到org.omcljs/om“1.0.0-alpha29”后遇到了一个错误:Uncaught TypeError:uri.call不是一个函数。知道为什么会这样吗?@zavalit尝试使用org.omcljs/om“1.0.0-alpha29-SNAPSHOT”更正我自己的答案:om.next.impl.parser/query->ast是函数,而不是教程中使用的om.next/query->ast。修复该问题,并将搜索字段功能中的onKeyUp更改为onChange,一切正常。仅供参考:您可以点击编辑并更改答案,而无需添加注释(人们可能不会阅读)。:-)