以编程方式添加处理程序来响应表单处理程序
Programmatically adding handlers to react form handler
在试图减少样板代码,我试图添加处理程序的常见表单字段的处理程序,以处理程序对象,将突出显示坏字段,显示一些错误等。到目前为止,我有这个:
//FieldHelper.js
exports.withStandardStoreHandlers = function (storeObj, fields)
{
for(var i = 0; i < fields.length; i++)
{
var f = fields[i];
var midName = f.charAt(0).toUpperCase() + f.slice(1);
storeObj.prototype["onUpdate" + midName] = function(event) {
this[""+f] = event.target.value;
this[f+"ValidationState"] = '';
this[f+"HelpBlock"] = '';
};
}
return storeObj;
}
最后我创建一个Alt存储,它是这样导出的:
export default alt.createStore(FieldHelper.withStandardStoreHandlers(AddressStore, "firstName", "lastName", "street"));
它实际上添加了"onUpdateFirstName" "onUpdateLastName"等方法,但不幸的是它们都使用最后传递的字段。所以在这个例子中,我在名字中输入了一些东西,但是onUpdateFirstName修改了街道文本字段及其验证状态/帮助块。
显然,解决方案是以某种方式复制"f"answers"midName"变量,以便每个动态创建的onUpdateX方法都有自己的值,而不是使用最后可用的,但我只是不知道如何在JavaScript中做到这一点。最好以尽可能向后兼容的方式,因为这将是在前端。
这是由于JavaScript中的var
是函数作用域,而不是代码所期望的块作用域。一个更好的解释可以在这里找到:https://stackoverflow.com/a/750506/368697
一个解决方案是通过使用forEach
:
f
。//FieldHelper.js
exports.withStandardStoreHandlers = function (storeObj, fields)
{
fields.forEach(function (f) {
var midName = f.charAt(0).toUpperCase() + f.slice(1);
storeObj.prototype["onUpdate" + midName] = function(event) {
this[""+f] = event.target.value;
this[f+"ValidationState"] = '';
this[f+"HelpBlock"] = '';
};
});
return storeObj;
}
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在AJAX回调和呈现PIXIJS之间处理程序流时遇到了问题
- Adobe Edge:动画完成时添加onComplete处理程序
- 是否可以从输入处理程序中确定输入的类型
- 在MVVM视图模型中处理应用程序范围的元素
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Python/Selenium网络驱动程序处理Angularjs/Javascript下拉列表
- 在 AJAX 完成之前,不要让其他处理程序处理
- 如何使用硒铬驱动程序处理地理位置弹出窗口
- 如何使用硒网络驱动程序处理 onblur 事件
- 是否有一种方法为chrome打包应用程序处理Http BasicAuthentication
- Ajax加载程序处理问题