2011-07-27 23 views
9

Próbuję pobrać integer z localStorage za pomocą prostej aplikacji clojurescript. Wszystko, co próbowałem, zakończyło się próbą, miało jakieś niewłaściwe zachowanie.Jak mogę pobrać liczbę całkowitą z localstorage i przymusić do liczby całkowitej za pomocą clojurescript

Poniżej znajduje się mój program bez inicjowania z lokalnego magazynu. Zignoruję klucz, który nie został znaleziony, ponieważ mam wersję JQuery, która obsługuje to, aby przygotować pamięć masową. Ponadto aplikacja JQuery odczytuje zapisy ClojureScript do wersji grzywny LocalStorage. To działa dla mnie.

Szybkie podsumowanie to. W moim komunikacie jest napisane: "Od ostatniego incydentu minęło kilka dni" Numer $ znajduje się w div o nazwie "counter". Mam trzy przyciski; jeden zwiększa liczbę, jeden zmniejsza liczbę, a ostatni zeruje liczbę do zera.

(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) 

Kiedy próbuję użyć goog.math.Integer.fromString(), aby rzucić na liczbę całkowitą, wywołanie inc dołączy do 1 na końcu (7 udał się do 71 i 711). Wezwanie do deca zrobi to, czego się spodziewam, zmniejszam go numerycznie (711 poszedł do 710 i 709). Oto, jak próbuję to zainicjować.

(defn initial-state [] 
    (integer/fromString (.getItem (.localStorage (dom/getWindow)) "count"))) 

zdałem sobie sprawę, że był to obiekt goog.math.Integer więc próbowałem zadzwonić .toNumber() na nim. Ale to i .toInt() wydawało mi się funkcją. function() {if (to znaczy == - 1) return-w (this) .D(); else {for (var a = 0, b = 1, d = 0; d = 0? e: Ua + e) b; b = Ua} return a}}, aby być dokładnym.

(defn initial-state [] (.toNumber 
    (integer/fromString (.getItem (.localStorage (dom/getWindow)) "count")))) 

Clojure wydaje się użyć klasy Integer Java, aby rzucić z ciągiem do int nawet do punktu, z konieczności (int „1”) rzucić tak, że pomysł został zastrzelony.

Próbowałem również wywołać parseInt javascript(). Tak to robię w wersji JQuery. Jednak wywołanie ClojureScript zawsze zwraca wartość 1. Nawet jeśli moja wersja JQuery przechowuje 8, o czym świadczą narzędzia programistyczne Chrome.

(defn initial-state [] 
    (.parseInt (dom/getWindow) 
      (.getItem (.localStorage (dom/getWindow)) "count"))) 

Jakieś pomysły, w jaki sposób mogę uzyskać wartość ciągu do zachowania się jako liczba całkowita? To musi być proste, ale nigdzie nie dochodzę.

Odpowiedz

27

może mieć dostęp do funkcji parseInt poprzez nazw js tak:

(js/parseInt "7") 
+1

Dlaczego nazywając str na "7"? – Pablo

+0

Bez powodu; Zmieniłem odpowiedź, aby ją usunąć. –

0

ClojureScript sposób:

(ns reader-test.core 
    (:require [cljs.reader :as reader])) 

(reader/read-string "7") ;; 7 - integer 
(reader/read-string "1.3") ;; 1.3 - non-integer number 

To działa nie tylko dla liczb całkowitych, ale dla każdego typu.

+0

Nie wolno używać "read-string" do niezaufanych danych: https://groups.google.com/forum/#!topic/clojure/YBkUaIaRaow – bmaddy

+0

Dziękujemy za uwagę. – akond

1

Oto metoda, która działa zarówno w Clojure i ClojureScript:

(defn- str->int [s] 
    #?(:clj (Integer/parseInt s) 
    :cljs (js/parseInt s))) 

(str->int "10") 
> 10 
Powiązane problemy