好的,我这里有两个版本的功能。一个有效,一个没有。代码基于多米纳源;我正在将相同的概念扩展到谷歌地图。 工作一:
(defn- create-listener-function
[f type]
(fn [evt]
(f (reify
ILookup
(-lookup [o k]
(if-let [val (aget evt k)]
val
(aget evt (name k))))
(-lookup [o k not-found] (or (-lookup o k)
not-found))
IAssociative
(-assoc [o k v]
(aset o (name k) v))))
true))
好的,所以上面的工作正常,我可以像这样查找返回对象的成员:
(:latLng obj)
但是,当我尝试使用下面的代码将某些内容与返回的对象关联时,我无法再检索对象的属性。
[f type]
(fn [evt]
(f (assoc (reify
ILookup
(-lookup [o k]
(if-let [val (aget evt k)]
val
(aget evt (name k))))
(-lookup [o k not-found] (or (-lookup o k)
not-found))
IAssociative
(-assoc [o k v]
(aset o (name k) v)))
:type type))
true))
我错过了什么?
答案 0 :(得分:0)
我认为您可能只需要通过其完全限定名称IAssociative
来引用cljs.core.IAssociative
协议。在任何情况下,如果我使用限定名称但不使用较短的名称,则下面的简化示例适用于我。
然而,我发现ILookup也有同样的事情,(我需要使用cljs.core.ILookup
),所以如果没有全名这对你有用,那么我或许就是我或你的设置有些不同。
cljs.user> (let [a (array 0 1 2 3)]
(def obj
(reify
cljs.core.IAssociative
(-assoc [_ k v]
(aset a k v)
(vec a)))))
nil
cljs.user> (assoc obj 0 'zero)
[zero 1 2 3]
cljs.user> (assoc obj 1 'one)
[zero one 2 3]