gpt4 book ai didi

asp.net - 我可以获得有关 JavaScript 委托(delegate)的一些建议吗?

转载 作者:数据小太阳 更新时间:2023-10-29 05:27:39 26 4
gpt4 key购买 nike

我对 JavaScript 中的委托(delegate)和闭包生疏了,我想我遇到过我想尝试使用其中之一或两者的情况。

我有一个网络应用程序,它的行为很像一个表单应用程序,字段访问服务器以更改每个 onBlur 或 onChange 上的数据(取决于表单元素)。我使用 ASP.NET 3.5 的 Web 服务和 jQuery 来完成大部分工作。

您需要了解的示例内容:

  • isBlocking() 是一种简单的机制来形成一些同步的函数(如互斥量)
  • isDirty(el) 检查以确保元素的值在浪费对服务器的调用之前实际更改
  • Agent() 返回 WebService 代理类的单例实例
  • getApplicationState() 将 base-64 编码的字符串传递给网络服务。该字符串表示应用程序的状态——元素的值和状态被传递给执行某些计算的服务。 Web 服务调用的 onSuccess 函数返回新状态,客户端处理并更新整个屏幕。
  • waitForCallback() 设置一个标志,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 方法可以接受不同数量的参数,但通常只是值和状态。因此,编写这些函数变得重复。到目前为止,我这样做是为了尝试使用委托(delegate):

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, index, count) {
Field_Changed(el, delegate(Agent().Field1_Changed, $j(el).val(), index, count), true);
}

function Field_Changed(el, theDelegate, checkIsDirty) {
???
}

function delegate(method) {
/* create the change delegate */
???
}

好的,我的第一个问题是:这一切值得吗?这是更难阅读但更容易维护还是相反?这是一项非常好的工作,所以我最终可能会悬赏这个,但如果您能提供任何帮助,我将不胜感激。谢谢!

更新

因此,我接受了一个答案,因为它为我指明了正确的方向。我想我会回来发布我的解决方案,以便其他可能刚刚开始使用委托(delegate)的人可以借鉴。我也发布它以查看是否有人想尝试对其进行优化或提出建议。这是我想出的常用 Field_Changed() 方法,checkForDirtyomitState 是可选参数:

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();
}
}

它处理我需要的一切(检查是否脏,在我需要时应用应用程序状态,并强制同步 web 服务调用。我这样使用它:

function TransactionAmount_Changed(el) {
Field_Changed(el, [cleanDigits($j(el).val())], Agent().TransactionAmount_Changed, true);
}

cleanDigits 去除了用户可能尝试输入的垃圾字符。所以,感谢大家,祝编码愉快!

最佳答案

好的,一些事情:

  1. 委托(delegate)在 javascript 中非常简单,因为函数是一流的成员。
  2. Function.apply 让您可以调用带有参数数组的函数。

所以可以这样写

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...]);

关于asp.net - 我可以获得有关 JavaScript 委托(delegate)的一些建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1112182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com