在Om.next中更新嵌套状态

在Om.next中更新嵌套状态

问题描述:

我在使用Om.next中的输入字段的数据更新状态时遇到问题。在Om.next中更新嵌套状态

在Om.next阅读状态通过查询解决,查询只是使组件来实现获取国家独立方面的,这是伟大的,因为这意味着该组件并不需要知道状态原子的结构,必须理解直接与之相关的州原子的局部片段。

不幸的是,我还没有能够确定一种方法来做到这一点在相反的方向,即基于用户与组件的交互作用来突变状态,而不是将它与状态原子中组件的位置耦合。

Web上的大多数示例都具有mutate功能,它们从根开始修改状态原子中的特定路径。

(defonce app-state (atom {:badge {:credentials {:user "" :password ""}}})) 

所以现在我去呈现组件:

Object 
(render [this] 
(dom/div nil 
     (dom/input #js {:onChange ??? 
         :value {:user value}}) 
     (dom/input #js {:onChange ???? 
         :value {:password value}}))) 

这是一个相当原始的例子,但我要如何更新状态时,用户类型,无需耦合到一个事实,即它是在路径存储[:badge :credentials]

这些读取的范围是查询范围,但突变不是。这是一个简单的人为的例子,但是当我试图用(编码时)未知形状呈现和更新嵌套树时,情况变得更糟。

:onChange可以调用你的突变:

:onChange (fn [_] (om/transact! this `[(app/set-name { :person 1 :name ~n })])) 
从参数

除此之外,并且其中突变是从所谓的地方,没有耦合 - 突变只不过是一个名称 - 在这里app/set-name 。当然,突变必须实施。那就是:

(defmethod m/mutate 'app/set-name 
    [{:keys [state] :as env} key {:keys [person name] :as params}] 
    {:action (fn [] 
    (swap! state update-in [:people/by-id person] assoc :person/name name))}) 

突变代码本身将处理标准化的应用程序状态,这意味着数据的结构,形状不是一棵树。

本例取自:http://localhost:3449/#!/untangled_devguide.G_Mutation