测试Clojure Om Next组件是否满足?协议

时间:2017-02-20 16:43:06

标签: clojure om

在Clojure(不是ClojureScript)中,如何检查给定组件是否实现了协议?

(defui MyComp
  static my-protocol
  (aaa [this] []))

(satisfies? my-protocol MyComp) ;; false
(satisfies? om.next.protocols/IReactChildren MyComp) ;; false
;; but
(.aaa ( MyComp nil nil nil nil)) ;; []

1 个答案:

答案 0 :(得分:0)

据我所知,om.next不直接支持,因为defui的行为与defrecord不完全相同。

一种方式(由未经处理使用)是将协议的实现放在meta数据中。与tony kay的对话:

  

tony.kay [6:02 PM]因此,clj land中的defui会添加“协议”的东西   元数据只需一秒......   https://github.com/untangled-web/untangled-client/blob/0b2fdfec1f0dde2d1d95b5a4d092131ca6fdc8f4/src/untangled/client/core.cljc#L90-L96   这就是为什么我们需要像get-initial-state这样的函数。我们可以打电话   cljs中的协议,但不是clj,因为js允许他的宏   将它们放入到位Om组件必须存储React   互操作的组件,所以我们实际上并没有使用协议本身,   只是模拟语法,这是我们需要的清理工作的一部分   在很多我们的文档/指南中梳理用于服务器端渲染。您   例如,不能在您的用户界面中调用initial-state并期望   clj-land喜欢它,但我们的许多例子都是在它之前编写的   存在,如果你想做ss渲染,现在技术上是错误的

这也是om.next在服务器端渲染中的完成方式。

也可以在om-css https://github.com/ladderlife/om-css/blob/dd19235dabca74db1669504fff941ff97abddcc4/src/main/om_css/core.cljc#L240-L242

中看到

不幸的是,由于这些方法需要覆盖defui,因此它们不能很好地组合在一起。