2014-07-03 4 views
5

प्रस्तुत करने के बाहर कर्सर में हेरफेर नहीं कर सकता पहली बार प्रतिक्रिया की कोशिश कर रहा है, और मैं एक साधारण todo सूची ऐप बनाना चाहता हूं। लेकिन हर बार जब मैं onSubmit ट्रिगर करने के लिए एंटर दबाता हूं तो यह Uncaught Error: Cannot manipulate cursor outside of render phase, only om.core/transact!, om.core/update!, and cljs.core/deref operations allowed कहता है। जबकि मुझे लगता है कि यह एक बहुत अच्छा त्रुटि संदेश है, मुझे नहीं पता कि क्या करना है।चरण

(ns app.core 
    (:require [om.core :as om :include-macros true] 
      [sablono.core :as html :refer-macros [html]])) 

(def app-state (atom 
       {:todos [{:todo "first"} 
         {:todo "second"}] 
       :current ""})) 

(defn to-do 
    [data] 
    (om/component 
    (html [:li (:todo data)]))) 

(defn to-dos 
    [data] 
    (om/component 
    (html [:div 
      [:form {:on-submit (fn [e] 
           (.preventDefault e) 
           (om/transact! data :todos (fn [v] 
                  (js/console.log (:current data)) 
                  (conj v (:current data)))))} 
      [:input {:type "text" 
        :placeholder "Enter some text." 
        :on-change (fn [e] (om/update! data :current (.. e -target -value)))}]] 
      [:ul 
      (om/build-all to-do (:todos data))]]))) 

(om/root to-dos app-state {:target js/document.body}) 

उत्तर

5

मुझे लगता है कि समस्या जहां ओम अंदर data का उपयोग/लेन-देन करते है! जहां v पर काम करना चाहिए:

बजाय (:current v)(:current data)

या आप डेटा

का सबसे हाल ही मूल्य के लिए (:current @data) कोशिश कर सकते हैं
+1

यह बिल्कुल सही – Dan

+1

का उपयोग करना है '(: वर्तमान v)' 'बहुत @ डेटा' कर्सर पुन: पहुंच बनाने के लिए बेहतर है। यद्यपि 'ओम/ट्रांसकैट' के लिए ': todos' तर्क के साथ, यहां दूसरी समस्या है! नीचे मेरा जवाब देखें। – prabhasp

1

वहाँ वास्तव में कर रहे साथ दो मुद्दों:

(om/transact! data :todos (fn [v] 
    (js/console.log (:current data)) 
    (conj v (:current data))))) 

एक है @edbond ने ऊपर क्या कहा: आपको (:current data) के बजाय (:current v) का उपयोग करना चाहिए। हालांकि, दूसरी समस्या यह है कि आप :todos कीवर्ड निर्दिष्ट कर रहे हैं, और इसके बजाय, आपको data स्वयं ही बदलना चाहिए, क्योंकि :current आपके ऐप-स्टेट में दिखाए गए :todos के बाहर है। तो सही सूत्रीकरण होगा:

(om/transact! data (fn [v] 
    (js/console.log (:current v)) 
    (conj v (:current v))))) 
संबंधित मुद्दे