我正在尝试使用一个简单的 clojurescript 应用程序从 localStorage 中提取一个整数。我尝试过的所有事情最终都出现了某种错误行为。
下面是我的程序,没有从本地存储初始化。我将忽略 key not found 的情况,因为我有一个 JQuery 版本来处理它以启动存储。此外,JQuery 应用程序读取 ClojureScript 保存到 localStorage 很好。所以这对我有用。
快速总结是这样的。我的消息说“自上次事件以来已有 $number 天” $number 位于名为“counter”的 div 中。我有三个按钮;一个增加计数,一个减少计数,最后一个将计数重置为零。
(ns days.core
(:require [goog.events :as events]
[goog.string :as string]
[goog.math.Integer :as int]
[goog.dom :as dom]))
(defn initial-state [] 0)
(def count (atom (initial-state)))
(defn set-counter [n]
(do (.setItem (.localStorage (dom/getWindow)) "count" n)
(dom/setTextContent (dom/getElement "counter") n)))
(defn set-button-fn [button-id f-update]
(events/listen (dom/getElement button-id)
"click"
(fn [] (do (f-update) (set-counter @count)))))
(defn start-app []
(do
(set-counter @count)
(set-button-fn "addDay" (fn [] (swap! count inc)))
(set-button-fn "decDay" (fn [] (swap! count dec)))
(set-button-fn "reset" (fn [] (reset! count 0)))))
(start-app)
当我尝试使用 goog.math.Integer.fromString() 转换为整数时,对 inc 的调用将在末尾附加一个 1(7 转到 71 和 711)。对 dec 的调用将按照我的预期进行,以数字方式递减(711 变为 710 和 709)。这就是我尝试初始化它的方式。
(defn initial-state []
(integer/fromString (.getItem (.localStorage (dom/getWindow)) "count")))
我意识到这是一个 goog.math.Integer 对象,所以我尝试调用 .toNumber() 。但是这个和 .toInt() 似乎给了我一个功能。函数 (){if(this.e==-1)return-w(this).D();else{for(var a=0,b=1,d=0;d=0?e:Ua+ e) b;b =Ua}return a}} 准确地说。
(defn initial-state [] (.toNumber
(integer/fromString (.getItem (.localStorage (dom/getWindow)) "count"))))
Clojure 似乎使用 java 的 Integer 类从字符串转换为 int 甚至到有 (int "1") 抛出的地步,所以这个想法被击中了。
我还尝试调用 javascript 的 parseInt()。这就是我在 JQuery 版本中的做法。但是,ClojureScript 调用始终返回 1。即使我的 JQuery 版本存储了 8,Chrome 的开发人员工具也证明了这一点。
(defn initial-state []
(.parseInt (dom/getWindow)
(.getItem (.localStorage (dom/getWindow)) "count")))
任何想法如何让该字符串值表现为整数?它必须很简单,但我无处可去。