asp.net – 我可以获得有关JavaScript代理的一些建议吗?
我对
JavaScript中的代理和闭包感到厌烦,并且认为我遇到过我想尝试使用其中一个或两个的情况.
我有一个Web应用程序,其行为很像表单应用程序,字段命中服务器以更改每个onBlur或onChange上的数据(取决于表单元素).我使用ASP.NET 3.5的Web服务和jQuery来完成大部分工作. 您需要了解的示例: > isBlocking()是一种形成一些同步函数的简单机制(如互斥锁) 以下是大约50个非常相似的函数之一的示例: function Field1_Changed(el) { if (isBlocking()) return false; if (isDirty(el)) { Agent().Field1_Changed($j(el).val(),getApplicationState()); waitForCallback(); } } 最大的问题是Agent().Field_X_Changed方法可以接受不同数量的参数,但通常只是值和状态.因此,编写这些函数会变得重复.到目前为止,我已经完成了尝试使用委托: function Field_Changed(el,updateFunction,checkForDirty) { if (isBlocking()) return false; var isDirty = true; // assume true if (checkForDirty === true) { isDirty = IsDirty(el); } if (isDirty) { updateFunction(el); waitForCallback(); } } function Field1_Changed(el) { Field_Changed(el,function(el) { Agent().Field1_Changed($j(el).val(),getTransactionState()); },true); } 这没关系,但有时我可以有很多参数: ... Agent().Field2_Changed($j(el).val(),index,count,getApplicationState()); .... 我最终想要做的是做一个亚麻布调用,这样的事情(注意没有getTransactionState()调用 – 我想以某种方式自动化): // Typical case: 1 value parameter function Field1_Changed(el) { Field_Changed(el,delegate(Agent().Field1_Changed,$j(el).val()),true); } // Rare case: multiple value parameters function Field2_Changed(el,count) { Field_Changed(el,$j(el).val(),count),true); } function Field_Changed(el,theDelegate,checkIsDirty) { ??? } function delegate(method) { /* create the change delegate */ ??? } 好的,我的第一个问题是:这一切都值得吗?这是难以阅读但更容易维护或反过来?这是一个非常好的事业,所以我最终可能会给这个奖励,但我很感激您提供的任何帮助.谢谢! UPDATE 所以,我已经接受了一个答案,因为它指出了我正确的方向.我以为我会回来发布我的解决方案,以便其他可能刚开始与代表一起开始模拟的人.我也发布它,看看是否有人想尝试优化它或提出建议.这是我提出的常见Field_Changed()方法,checkForDirty和omitState是可选参数: function Field_Changed(el,args,delegate,checkForDirty,omitState) { if (isBlocking()) return false; if (!$j.isArray(args) || args.length == 0) { alert('The "args" parameter in Field_Changed() must be an array.'); return false; } checkForDirty = checkForDirty || true; // assume true if not passed var isDirty = true; // assume true for updates that don't require this check if (checkForDirty === true) { isDirty = fieldIsDirty(el); } if (isDirty) { omitState = omitState || false; // assume false if not passed if (!omitState) { var state = getTransactionState(); args.push(state); } delegate.apply(this,args); waitForCallback(); } } 它处理我需要它的所有内容(检查脏,在需要时应用应用程序状态,并强制同步webservice调用.我使用它像这样: function TransactionAmount_Changed(el) { Field_Changed(el,[cleanDigits($j(el).val())],Agent().TransactionAmount_Changed,true); } cleanDigits剥离了用户可能试图输入的垃圾字符.所以,感谢大家,编码愉快! 解决方法
好的,很少的东西:
>代理在javascript中非常简单,因为函数是一等成员. 所以你可以这样写 function Field_Changed(delegate,args) { if (isBlocking()) return false; if (isDirty(args[0])) { //args[0] is el delegate.apply(this,args); waitForCallback(); } } 称之为: Field_Changed(Agent().Field2_Changed,[el,getApplicationState(),whatever...]); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – 为什么OWIN的SignInAsync()没有设置IsAuthenticate
- asp.net-mvc – 编辑GridModel中的链接(MVCContrib)
- ASP.NET MVC 3 jQuery验证;禁用不引人注意的OnKeyUp?
- asp.net-mvc-4 – 如何在MVC4中呈现远程ReportViewer aspx页
- 将ASP.NET从1.1升级到2.0 – 任何问题?
- asp.net – 类型“……”含糊不清:它可能来自程序集“…”
- asp.net-mvc – 隐藏字段的完整性:Asp.NET mvc
- asp.net – 用于DropDownList的MVC2 EditorTemplate
- 在Asp.Net中启用Secure中的HTTPOnly
- asp.net – URL没有可用扩展名时重定向
- asp.net – 网站随时随地突破
- asp.net-mvc – 如何从基本控制器获取操作名称?
- asp.net-mvc – 在IE中清除cookie后,保持用户登录
- asp.net – 代码无效或已过期.使用API??调用显式
- asp.net-mvc – ASP.NET MVC 3绑定确保表单值优先
- ASP.NET实现TreeView的XML数据源绑定实例代码
- asp.net – 将TemplateField的可见性绑定到Bound
- asp.net-mvc – 使用ViewModel的MVC 3动态表单
- Asp.net Core 1.1 升级后操作mysql出错的解决办法
- 使用asp.net验证器控件和JQuery进行前端验证有什