【问题标题】:Om-next Remote Sync Tutorial send-to-chanOm-next 远程同步教程 send-to-chan
【发布时间】:2016-01-05 03:18:25
【问题描述】:

我可能做错了什么,但我相信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

我不知道为什么会这样。

任何帮助将不胜感激。

【问题讨论】:

  • 你可能在Slack 上运气更好,围绕 om-next 的大部分开发都是实验性的,因为它仍然是 pre-alpha 软件。
  • 是的,这就是我读到的。我在 Slack 和 IRC 上发帖,但没有人回答或说什么。我打算在我的帖子中提到的 github 链接上发帖,因为这有助于我的第一个问题,但他们基本上说了同样的话,关于 Slack。当您尝试学习时,超级沮丧。我想我会更深入地研究 om-next 源代码(无论如何现在已经这样做了一段时间)并试图弄清楚发生了什么。谢谢。
  • 把它当作一门全新的语言,用它自己的原语和规则。我也在试图弄清楚,这有点让人心烦意乱,几周后你不会像大卫诺伦那样。
  • 真的,真的。我只是在想“官方”教程实际上会起作用。大声笑。
  • @user2517182 他们没有。它们尚未更新,我知道目前这不是一个高优先级。

标签: clojure autocomplete clojurescript om


【解决方案1】:

不确定这是否是正确的处理方式,但这是我为解决此问题所做的。

  1. 从 github 结帐 om。 (https://github.com/omcljs/om)
  2. cd om
  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

【讨论】:

  • 嗨,就我而言,升级到 org.omcljs/om "1.0.0-alpha29" 后出现错误:Uncaught TypeError: uri.call is not a function 知道为什么会这样吗?
  • @zavalit 尝试使用 org.omcljs/om "1.0.0-alpha29-SNAPSHOT"
【解决方案2】:

关于每个需要“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 函数不必返回一个数字,但它必须为每个被迭代的项目返回某种唯一标识信息(在这种情况下,标题不是)。

顺便说一句,您也可以使用map-indexed 生成一个数字以输入到键函数中,或者使用随机数生成器。

【讨论】:

  • 谢谢!我仍然掌握这一切的窍门。我将尝试在教程代码中实现这些信息,看看效果如何。
【解决方案3】:

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

这是一个 hacky 解决方法:

    (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.impl.parser/query->ast 是函数,而不是教程中使用的 om.next/query->ast。修复该问题并将搜索字段功能中的 onKeyUp 更改为 onChange,一切正常。
  • 仅供参考:您可以点击编辑并更改答案而无需添加评论(人们可能不会阅读)。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2012-06-05
  • 1970-01-01
  • 2019-11-14
  • 2012-03-05
相关资源
最近更新 更多