输出javascript的语言有所增加,例如CoffeeScript和ClojureScript.由于javascript不会很快消失,我认为这种发展模式将继续下去.
人们遇到的一个问题是你用一种语言编写代码并在另一种语言中调试.关于C和汇编之间的关系也可以这样说,但是生成的汇编可以嵌入调试元数据,以便C调试器知道汇编与C源sode的关系.例如:此程序集块所代表的行号.
现在我的问题是:
是否有人知道任何类似的努力允许调试元数据嵌入到CoffeeScript和Clojurescript等语言的结果javascript中?
据我所知,这至少需要一个支持这种理论元数据的调试器.
这当然是微不足道的,但我无法在任何地方找到它.我正在尝试摆弄ClojureScript.我能够使用ClojureScript One获得ClojureScript REPL .
我可以连接浏览器并在那里执行一些简单的DOM查询和操作.现在我想开始将一些有用的函数保存到模块中并根据需要加载它们.这是我被卡住的地方.
如果我尝试类似的东西
(require 'project.dom)
Run Code Online (Sandbox Code Playgroud)
我得到了例外FileNotFoundException Could not locate project/dom__init.class or project/dom.clj on classpath.我确实只有project/dom.cljs,因为我看到示例中的所有ClojureScript文件都使用此扩展名.
如果我尝试将其重命名为project.clj,我会收到有关缺少命名空间的投诉js.当然,我在模块中使用了很多名称空间.
编写一个可以与浏览器一起使用并从REPL加载它的简单ClojureScript文件的正确方法是什么?能够运行这个简单示例的任何东西都可以:
(ns ^{:doc "A module for selecting elements from the DOM."}
project.dom)
(defn get
[selector]
(.querySelectorAll js/document selector))
Run Code Online (Sandbox Code Playgroud) 我想在ClojureScript中使用Clojure Monad库clojure.contrib.monads.是否有一个已经过测试的实现与ClojureScript一起使用,因为它没有出现在标准的ClojureScript发行版中?
(我在假设我可能只需将代码从clj复制并粘贴到clj中.虽然这些宏需要在clj文件中,但是
档
好吧,看起来这不存在.我将不得不首先在Clojure中完成实现,以确保不使用eval和类似的东西,因为Clojurescript不支持Clojure的所有功能.
我正在阅读这个OM教程但是我不清楚何时使用OM组件与普通函数(特别是om /组件宏).
该教程写道:
第一个参数是一个函数,它接受应用程序状态数据和后备React组件,这里称为owner.此函数必须返回Om组件 - 即om/IRender接口的模型,如om.core/component宏生成
; here the function (fn [app owner]) indeed returns an OM component
(om/root
(fn [app owner]
(om/component (dom/h2 nil (:text app))))
app-state
{:target (. js/document (getElementById "app"))})
Run Code Online (Sandbox Code Playgroud)
在下一节中,我们找到以下列表的呈现循环示例:
; this one does not return an om component (or does it?). it returns a virtual dom
(om/root
(fn [app owner]
(apply dom/ul nil
(map (fn [text] (dom/li nil text)) (:list app))))
app-state
{:target (. js/document (getElementById "app0"))})
Run Code Online (Sandbox Code Playgroud)
在这里,我们基本上只是直接返回一个(虚拟)dom,而不是包含在OM组件中,所以问题是:为什么om/component宏存在?宏只是帮助我们验证IRender功能,但看起来我们也可以只使用普通函数.我会介绍具有生命周期状态的OM组件(或者需要所有者调用get-props)但是对于只需要创建虚拟dom的组件我宁愿选择简单的函数(所以我不需要构建/构建 - 创建我的虚拟dom的所有功能).我在这里错过了什么?为什么宏仍然有用(我没有看到它).
我不确定最好的方法来解决这个问题:
我有一个我正在编写的Web应用程序,它为许多"Project"对象实现了基本的CRUD功能.因此,用户可以创建他/她自己的项目集.
我编写了一个REST API来添加/删除/列出项目,我编写了一个Reagent前端客户端.正如您所料,客户的项目保存在试剂原子(ratom)中.
这是它变得有趣的地方.
在我看过的所有教程中,它向您展示了如何更新ratom,您的GUI将自动更新.我有,那有效.
我目前正在做的是,在更新客户端状态时,我进行REST POST调用以更新数据库上的服务器状态.
但是,这感觉不对.我现在将状态存储在两个地方:在客户端和服务器上,两者可能不同.
如果我将其实现为一个普通的旧网页,服务器会将页面发送回客户端,其中包含数据库的最新状态.但是,状态已经存在于客户端的ratom中,我不知道应该如何同步它.
初始POST成功后,我应该再次调用服务器(GET请求)吗?这可以取代鼠标的内容.然后我要两个请求......这看起来很浪费.
或者是使用chord或sente之类的东西来异步管理客户端状态的最佳实践.这样会更好,因为这意味着来自其他用户的更改将在客户端即时刷新.但是,我看不到任何教程证明与其中任何一个反应,所以也许我在错误的轨道上.
所以问题很简单,一个人应该如何与REST做出反应?
谢谢
我正在尝试用Reagent/React构建一个Hello World应用程序.我使用:value/ :on-changecombo 将输入与原子绑定.但是,当我输入时,输入仍为空:
(defn new-user []
; Atom declared in an inner `let`.
(let [v (atom "")]
[:div
[:input {:type "text"
:value @v
:on-change (fn [evt]
(reset! v (-> evt .-target .-value)))
}]]))
(defn app [state]
[:div
[:p "State" (pr-str @app-state)]
[new-user]])
(r/render-component [app app-state]
(.-body js/document))
Run Code Online (Sandbox Code Playgroud)
如果我将原子移出let,它将起作用:
; Atom is now top-level.
(defonce v (atom ""))
(defn new-user []
[:div
[:input {:type "text"
:value @v
:on-change (fn [evt]
(reset! v (-> evt .-target …Run Code Online (Sandbox Code Playgroud) 我试图用试剂项目/试剂·GitHub来开发FormidableLabs/radium ·GitHub,但我已经走到了尽头.
我能够通过这样的"黑客"试剂功能部分地工作create-class(它与原始的几乎相同,我只是添加了js/Radium包装).
(ns myproject.components.radium
(:require [reagent.core :as r]
[reagent.impl.component :as c]
[reagent.impl.util :as util]
[reagent.interop :refer-macros [.' .!]]))
(defn create-class
[body]
(assert (map? body))
(let [
spec (c/cljsify body)
res (js/Radium (.' js/React createClass spec))
;res (.' js/React createClass spec)
f (fn [& args]
(r/as-element (apply vector res args)))]
(util/cache-react-class f res)
(util/cache-react-class res res)
f))
Run Code Online (Sandbox Code Playgroud)
然后我为这样的组件制作了功能
(defn radium []
(create-class
{:reagent-render
(fn []
[:button {:style
[{:backgroundColor "red"
:width 500
:height …Run Code Online (Sandbox Code Playgroud) 我一直在使用Clojure Spectre库(https://github.com/nathanmarz/specter)加快速度.我遇到的问题是使用transform或setval删除密钥.我可以将其设置为nil,但如何删除密钥?
我一直在读这个,但似乎没有教程/文档关于这两者之间的区别或诸如此类的东西.
套接字repl会替换nrepl吗?
clojurescript ×10
clojure ×6
reagent ×3
reactjs ×2
chord ×1
coffeescript ×1
debugging ×1
javascript ×1
monads ×1
nrepl ×1
om ×1
specter ×1