標高+1m

Don't be rational

アプリ全体の状態を持つこと

ClojureScriptをちょこちょこ使っています。最近はもっぱらcore.asyncとかFRPとかでアプリケーションを作っていたんですが、PastaやWebFUIでやっていた、"アプリ全体の状態を更新する関数と、状態からUIを作る手続き"という仕組みが恋しくなっています。

この仕組みを最小限で実現するために1つのマクロと1つの関数を書きました。
https://github.com/ympbyc/pasta-cljs

(def app (atom {:page 0}))

(deftransition next-page [{:keys [page]}]
  {:page (inc page)})

(deftransition page-to [_ n]
  {:page n})

(watch-transition app :page
  (fn [{:keys [page]} _old]
    ;;ページきりかえを描画
    ))

(.on (js/jQuery js/document) "click" ".next-page-btn"
     #(next-page app))

(.on (js/jQuery js/document) "click" ".pager-link"
     #(page-to app 
        (read-string (.getAttribute (.-target %) "data-page-num"))))

状態のマップからUIを完全に復元できるようにするのが重要。

watch-transitionの中でdomをちまちまいじるのが面倒ならappにadd-watchしてcastorocauda.core/update-domとかやっちゃうのもあり。