【发布时间】:2016-05-05 22:18:22
【问题描述】:
我在我的应用程序中使用通量,我使用Backbone.View 作为视图层。
一般整个页面都有一个store实例,store保存应用的数据(或状态),视图会监听store的change事件,当store触发change 事件,视图将相应地重新渲染。
到目前为止一切顺利,但是我在使用表单时遇到了一些问题,当使用尝试提交表单或为元素触发 blur 事件时,我想验证服务器中的输入并显示错误尽快,这就是我所做的:
当用户点击提交按钮或某个元素的值发生更改时,我将发送如下操作:
dispatch({type:"validate",value:"value"});store将响应此操作并向服务器发送请求当响应返回时,我将更新存储并触发
change事件:store.validate_response=response; store.trigger("change");- 视图(示例中的表单)将重新呈现自身。
我可以显示错误但我不能保留元素的值,因为表单中的元素会重新渲染,这意味着它们将显示原始值而不是用户键入的值。
我曾想过在像这样发送验证操作时也保存输入的值:
dispatch({type:"validate",value:"value",userTypedValueForEveryElement:"....."});
它在使用点击提交按钮时起作用,因为通常当他们点击按钮时,他们不会在表单中输入任何内容,但是这种情况如何:
<input type="text" id="A" />
<input type="text" id="B" />
用户在inputA中输入avalue,然后在inputB中输入bv,同时我会做验证,并在派发动作时发送两个值:
{a:"avalue",b:"bv"}
store 将保留这些值。
在请求过程中,用户不断输入元素B,现在值是bvalue,同时返回验证响应,然后表单将重新渲染,并设置avalue对于A 和bv 对于B,这就是重点,B 的值丢失了,用户会感到惊讶,他们不知道发生了什么。
有办法解决这个问题吗?
看来flux的方式:
view trigger action -->
store respond to actions -->
store trigger changed -->
view respond to store(re-render in most case) -->
view trigger action"
使这种要求比以前复杂。一旦您的视图有太多的交互性,您将不得不做更多额外的工作来保持视图的状态。
这是真的还是因为我错过了什么?
【问题讨论】:
-
输入验证它自己而不去商店怎么样?
-
@korven 这将打破flux/redux prencple,并且有很多交互,验证就是其中之一。
-
当我使用 Flux 设计时,我从不在存储中保留任何逻辑,只保留组件可以显示的值。逻辑放置在组件中。 Leet 输入验证它自己到服务器,如果正确发送操作来存储以保持新值
-
不要重新渲染整个表单,只更新改变的部分。
标签: javascript flux