代码之家  ›  专栏  ›  技术社区  ›  user2517182

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

  •  4
  • user2517182  · 技术社区  · 8 年前

    我可能做错了什么,但我相信 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 回复  |  直到 8 年前
        1
  •  1
  •   user2517182    8 年前

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

    1. 从github查看om。( https://github.com/omcljs/om )
    2. 光盘光盘
    3. lein安装

    现在您的系统上有最新的om。(您不能只将其放在项目文件中,因为它没有打开 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 .

        2
  •  0
  •   egracer    8 年前

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

    顺便说一下,您还可以使用 map-indexed 或者使用随机数生成器。

        3
  •  0
  •   Craig Ludington    8 年前

    我认为问题是om。下一个/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])))))