我们有一个对服务器端代码进行大量 jQuery JSON 调用的应用程序。正因为如此,我们有大量的绑定代码来解析响应并将适当的值绑定到表单。这是一个两部分的问题。
处理具有不同数据的大量表单的推荐方法是什么。现在正在尝试采用结构化方法为每个页面设置一个 js“类”,包括一个 init、wireClickEvents 等。试图让一切都符合要求。
除了在 js 文件中抛出一堆函数之外,是否有任何“最佳实践”来创建重复的 jQuery 代码或任何类型的推荐结构?
我们有一个对服务器端代码进行大量 jQuery JSON 调用的应用程序。正因为如此,我们有大量的绑定代码来解析响应并将适当的值绑定到表单。这是一个两部分的问题。
处理具有不同数据的大量表单的推荐方法是什么。现在正在尝试采用结构化方法为每个页面设置一个 js“类”,包括一个 init、wireClickEvents 等。试图让一切都符合要求。
除了在 js 文件中抛出一堆函数之外,是否有任何“最佳实践”来创建重复的 jQuery 代码或任何类型的推荐结构?
你可能应该研究一下像knockout.js 这样的框架,这样你就可以更新你的模型,表单会自动更新。
不是 100% 确定您所要求的示例,但就个人而言,我使用 MochiKit,我为每个重要的客户端 UI 结构创建 JavaScript“类”(或小部件,如果您愿意)。当然,这些人知道如何用数据填充自己。
我不知道还有什么要说的——就我而言,用 JavaScript 为浏览器编写 UI 代码与为其他类型的应用程序编写 UI 代码没有什么不同。构建类并根据需要实例化它们,用数据填充它们,让它们抛出事件等等。
我在这件事上半夜起床吗?:)
编辑:换句话说,是的 - 在大多数情况下做你正在做的事情。我看到太多的新手 JavaScript 黑客编写了一堆内聚性差的函数,这些函数似乎不是任何特定内容的一部分,只是它们都在一个文件中。希望这是有道理的。
我认为你有很多挑战。第一个问题是如何构建 javascript 代码,即如何构建命名空间,这样您就不会遇到名称冲突或必须将您的函数命名为
form1validate
form1aftersubmit
form2validate
form2aftersubmit
javascript 中已验证的模块模式之一是使用匿名函数来构建新的命名范围。基本思想体现在以下代码中
(function() {
var foo = 1;
})();
(function() {
if(foo == 1) alert("namespace separation failed!")
})();
我认为这个博客条目是一个很好的介绍。
您面临的第二个问题是如何避免 javascript 代码中的所有重复。你有几个武器来对付这个。
让我从脑海中构建一个例子(使用 jquery 来说服)
// this is a validator for one form
var form1validator = function() {
if($("input[name=name]",this).attr("value").length < 1 &&
$("input[name=organisation]",this).attr("value").length < 1)
return "Either name or organisation required"
}
// and this for a second form
var form2validator = function() {
if($("input[name=age]",this).attr("value").length < 21
return "Age of 21 required"
}
// and a function to display a validation result
var displayResult = function(r) {
$(this).prepend("<span></span>").text(r);
}
// we use them as higher order functions like that
$("#form1").onSubmit(validator(form1validator, displayResult, function() {
//on submit
...send some xhr request or like that
});
$("#form2").onSubmit(validator(form2validator, displayResult, function() {
this.submit() // simply submit form
});
$("#form1b").onSubmit(validator(form1validator, function(r) {
alert("There was an validation error " + r);
}, function() {
//on submit
...send some xhr request or like that
});
// the validator function itself would be defined as
function validator(formValidator, displayResult, onSubmit) {
var r = formValidator.apply(this)
if(typeof(r) === 'undefined')
onSubmit(this)
else
displayResult(r)
}