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

从ClojureScript中的另一个命名空间调用函数

  •  2
  • aarkerio  · 技术社区  · 8 年前

    我是CojureScript的新手,因为几个月前我就开始口齿不清了,然后我把API移植到了Clojure,我很喜欢它。现在我也想迁移前端,但这是我与CLJS的第一周。

    所以,我有一个函数:

    (defn foo []
       (events/listen (gdom/getElement "icon-add") EventType.CLICK
          (fn [e] (.log js/console (str ">>> VALUE >>>>> "  e)))))
    

    该函数在核心.cljs但如果我把它移到用户.cljs我从核心名称空间调用它:

    (ns zentaur.core
      (:require [zentaur.users :as users]
    
    (users/foo)
    

    Uncaught goog.asserts.AssertionError {message: "Assertion failed: Listener can not be null.", reportErrorToServer: true, 
    

    在浏览器控制台中。如果我把函数移回核心.cljs,一切又恢复正常了。那么我的问题是:如何将一个函数移动到另一个NS并确保它继续工作?

    更新 :

    我注意到如果我直接给听众打电话用户.cljs:

    (events/listen (gdom/getElement "icon-add") EventType.CLICK
       (fn [] (.log js/console (str ">>> events/listen in users ns"))))
    

    (我的意思是在任何函数之外),一切正常,代码找到DOM元素。

    非常感谢您的回答,但这个问题看起来像是一个“编译时间”的问题。所有听众:

    (events/listen (gdom/getElement "icon-add") EventType.CLICK foo-funct)
    

    必须在第一次运行CLJS时加载。加载另一个 是一个“第二次”的事情,然后DOM是不可访问的了。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Alan Thompson    8 年前

    在核心命名空间中,您需要 require 第二个命名空间:

    (ns xyz.core
      (:require [xyz.users :as users] ))
    
    (users/foo)  ; call the function
    

    这假设您的代码按

    src
    src/xyz
    src/xyz/core.cljs
    src/xyz/users.cljs
    

    some good ideas here 在命名和引用其他名称空间时的各种权衡。

        2
  •  3
  •   Chris Murphy    8 年前

    用户名称空间的特殊之处在于它被设计为预加载的,并且仅用于开发。这也是您唯一一次看到没有父包的命名空间。我这么说只是警告你不要使用 user 作为名称空间名称-这样做只会导致混淆-它是否有父包。

    你的问题似乎是 events/listen nil . 你有 gdom 作为要求 zentaur.users ,所以: [goog.dom :as gdom] ?

        3
  •  2
  •   Toni Vanhala    8 年前

    Google Closure 库抛出断言错误,因为侦听器函数,即 listen 是 null .

    it tries to wrap the third parameter into a Listener ,并且错误字符串是从 this failed assertion for a truthy value .

    我经常遇到类似的问题,当我不小心在函数周围加了一个括号。实际上,这会导致函数在声明之后立即被调用。即使声明的函数需要一个或多个参数,这种情况也可能在没有警告的情况下发生;ClojureScript在JS上运行,而JS在调用函数时不检查arity。因为你的听众的身体 console.log ,返回 无效的 ,您将尝试分配 无效的 作为听众。

    您确实注意到,您给出的代码示例 core.cljs . 事实上,这个例子并没有显示函数在这种情况下为null的任何明显原因。将此函数复制粘贴到 users.cljs