4

値を取得するためにいつカーソルを逆参照する必要があるかを理解しようとしています。

om cursors wikiでは、イベント ハンドラーはレンダリング フェーズの一部ではないと見なされるため、ハンドラー内のカーソルは drefed にする必要があると述べています。Basic-tutorialにも同じことが示されています。

(defn contact-view [contact owner]
  (reify
    om/IRenderState
    (render-state [this {:keys [delete]}]
      (dom/li nil
        (dom/span nil (display-name contact))
        (dom/button #js {:onClick (fn [e] (put! delete @contact))} "Delete")))))

しかし、TodoMVC コードでは、ハンドラー (onclick、onchange...) はカーソルを逆参照せずに使用します。

(dom/button
   #js {:className "destroy"
        :onClick (fn [_] (put! comm [:destroy todo]))}))

それで、正しい方法は何ですか?

ありがとうございました。

4

1 に答える 1

0

deletecommはカーソルではなく、core.async チャネルであることに注意してください。このput!操作は、ここで処理されるチャネルにメッセージを追加します。

カーソルは、状態をラップする方法です (om では app-state と呼ばれます)。その状態でやりたいことが 2 つあります。

  1. 状態を変更します。アプリの状態を変更する場合は、カーソルをアプリ状態に呼び出すom/transact!om/update!、カーソルを呼び出します (deref は必要ありません)。Om は、このトランザクションが次のレンダリング フェーズで表示されるようにスケジュールします。
  2. 状態の読み取り: レンダリング段階で読み取る場合 ( renderandrender-state関数内では、カーソルはその値のように機能します。つまり、逆参照する必要はありません。他の時点では、カーソルは処理されているか、スケジュール トランザクションなので、一貫性のない状態ではなく、現在の値を取得するために逆参照する必要があります。
于 2015-08-12T11:08:58.670 に答える