(defn editing-mode? []
"a hardcoded (for the moment) value, will look up in db later"
false)
(def UP 38) ;; goog.events.KeyCodes.UP
(def DOWN 40) ;; goog.events.KeyCodes.DOWN
(def LEFT 37) ;; goog.events.KeyCodes.LEFT
(def RIGHT 39) ;; goog.events.KeyCodes.RIGHT
(def W 87) ;; goog.events.KeyCodes.W
(def S 83) ;; goog.events.KeyCodes.S
(def A 65) ;; goog.events.KeyCodes.A
(def D 68) ;; goog.events.KeyCodes.D
(def E 69) ;; goog.events.KeyCodes.E
(def ESC 27) ;; goog.events.KeyCodes.ESC
(defn delta [e]
;; e is a google closure Event
(js/console.log (.-keyCode e))
(js/console.log (editing-mode?))
(match [(editing-mode?) (.-keyCode e)]
[false 38] [:slide :up]
[false 40] [:slide :down]
[false 37] [:slide :left]
[false 39] [:slide :right]
[false 87] [:slide :up]
[false 83] [:slide :down]
[false 65] [:slide :left]
[false 68] [:slide :right]
[false 69] [:start-editing]
[true 27] [:done-editing]
:else nil))
上面的代码有效。但是,如果我尝试不那么罗嗦,直接使用 goog 键码,就像这样
(match [(editing-mode?) (.-keyCode e)]
[false goog.events.KeyCodes.UP] [:slide :up]
[false goog.events.keyCodes.DOWN] [:slide :down]
...
我收到以下 cljsbuild 错误:
...
Caused by: clojure.lang.ExceptionInfo: Invalid local name: goog.events.KeyCodes.UP ...
...
好的,所以我不能使用goog.events.KeyCodes.*
它们自己,但也许我可以使用def
对它们的引用?所以我尝试
(match [(editing-mode?) (.-keyCode e)]
[false UP] [:slide :up]
[false DOWN] [:slide :down]
...
这确实可以编译,但现在匹配不起作用。每个关键事件都匹配[false UP]
match 子句(core.match 总是发出[:slide :up]
)。
无论如何,第一个代码示例确实有效。但是为什么我不能在我的 core.match 匹配器中使用goog.events.KeyCodes.*
或引用?goog.events.KeyCodes.*
有什么我想念的吗?