Je fais probablement quelque chose de mal, mais je crois que l’un des tutoriels om-next a quelques problèmes; spécifiquement l'exemple de saisie semi-automatique. J'ai pu découvrir l'un des problèmes, mais il y a un autre problème qui me cause quelques problèmes.

Une fois que j'ai mis plus de deux lettres dans la zone de saisie pour l'auto-complétion, le code suivant:

(defn send-to-chan [c]
  (fn [{:keys [search]} cb]
    (when search
      (let [{[search] :children} (om/query->ast search)
            query (get-in search [:params :query])]
        (put! c [query cb])))))

Produit l'erreur suivante:

Uncaught TypeError: Cannot read property 'call' of undefined
core.js?zx=3jufl8vymlgw [452]   om_tutorial.core.send_to_chan
next.js [3034]  om.next.Reconciler.om$next$protocols$IReconciler$send_BANG_$arity$1
protocols.js [303]  om$next$protocols$send_BANG_
next.js [1656]  anonymous

Je ne sais pas pourquoi c'est le cas.

Toute aide serait grandement appréciée.

4
user2517182 5 janv. 2016 à 06:18

3 réponses

Meilleure réponse

Je ne sais pas si c'est la bonne façon de faire les choses, mais c'est ce que j'ai fait pour résoudre ce problème.

  1. Checkout om de github. (https://github.com/omcljs/om)
  2. cd om
  3. installer lein

Maintenant, le dernier om est disponible sur votre système. (vous ne pouvez pas simplement le mettre dans votre fichier projet, car il ne se trouve pas sur https://clojars.org/repo/ encore).

  1. Maintenant, c'est là que je pense que la confusion s'est produite pour moi. Plus tôt dans le tutoriel, avant l'exemple de correction automatique; il y a un dossier de projet qui est défini avec [org.omcljs/om "1.0.0-alpha23"]. Puis quand le un exemple de correction automatique apparaît, j'ai utilisé le même projet configurations car il n'y avait aucune mention de la façon de configurer le à nouveau le fichier projet. Il s'avère que vous devez utiliser [org.omcljs/om "1.0.0-alpha29"].

Une fois que cela se produit, tout fonctionne bien que j'obtienne l'avertissement suivant.

Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `om_tutorial$core$AutoCompleter`. See https://fb.me/react-warning-keys for more information.

Ce sera un combat pour un autre jour.

BTW. Depuis que j'ai utilisé l'ancienne version d'om à l'origine, le simple fait d'installer la nouvelle n'a pas résolu le problème. lein clean n'a pas non plus résolu le problème. J'ai dû supprimer manuellement mon dossier om-tutorial/resources/public/js. Exécutez ensuite lein run -m clojure.main script/figwheel.clj.

2
user2517182 7 janv. 2016 à 07:01

L'erreur au sujet de chaque tableau enfant nécessitant une prop "clé" a plus à voir avec React qu'avec Om. React exige que chaque sous-composant ait un identifiant unique.

Si vous itérez sur une méthode d'usine, il ne générera pas automatiquement un nouvel identifiant pour chaque sous-composant. Vous devez spécifier une fonction clé:

(def app-state 
  (atom {:items [{:id 1
                  :title "Foo"}
                 {:id 2
                  :title "Foo"}]}

(defui Item
 static om/IQuery
 (query [this] [:id :title])
 Object
 (render [this]
   (dom/li nil (:title (om/props this))))

;; Specify key function as follows
(def item (om/factory Item {:keyfn :id})

(defui List
 static om/IQuery
 (query [this] [{:items (om/get-query Item)}])
 Object 
 (render [this]
   (dom/ul nil (map item (:items (om/props this)))))

La fonction clé n'a pas à renvoyer un nombre, mais elle doit renvoyer une sorte d'information d'identification unique pour chaque élément en cours d'itération (ce qui dans ce cas, le titre n'est pas).

Incidemment, vous pouvez également utiliser map-indexed pour générer un nombre à alimenter dans la fonction clé, ou utiliser un générateur de nombres aléatoires.

0
egracer 21 janv. 2016 à 04:53

Je pense que le problème est que om.next/query->ast n'est pas défini dans 1.0.0-alpha23 - c'était la source de l'appel sur une erreur non définie.

Voici une solution de contournement:

    (defn send-to-chan [c]
      (fn [{:keys [search] :as x} cb]
        (when search ;; e.g. [(:search/results {:query "xxx"})]
          (let [query (-> search first second :query)]
            (put! c [query cb])))))
0
Craig Ludington 12 févr. 2016 à 18:41