我们有一个应用程序,它对服务器端代码进行了大量的jQuery JSON调用。因此,我们有大量的绑定代码来解析响应并将适当的值绑定到表单。这是一个两部分问题。
处理大量具有不同数据的表单的建议方法是什么?现在正在尝试采用结构化方法为每个页面设置一个js“类”,使用init,wireClickEvents等来尝试使所有内容符合。
除了在js文件中抛出一堆函数之外,是否存在创建重复jQuery代码或任何类型的结构化结构的“最佳实践”?
答案 0 :(得分:5)
您应该查看类似knockout.js的框架。这样您就可以更新模型,表单会自动更新。
答案 1 :(得分:2)
不是100%肯定你要问的例子,但就个人而言,我使用MochiKit,我为每个重要的客户端UI结构创建JavaScript“类”(或小部件,如果你愿意)。当然,这些都知道如何用数据填充自己。
我不知道还有什么可说的 - 就我而言,在JavaScript中为浏览器编写UI代码与为其他类型的应用程序编写UI代码没有什么不同。构建类并根据需要实例化它们,用数据填充它们,让它们抛出事件等等。
我在这个晚上起来了吗? :)
答案 2 :(得分:0)
我认为你有多种挑战。第一个问题是如何构建javascript代码,即如何构建命名空间,以便您不打击名称冲突或必须命名您的函数,如
form1validate
form1aftersubmit
form2validate
form2aftersubmit
javascript中模块的一种经过验证的模式是使用匿名函数来构建新的命名范围。基本思想是在以下代码中实现的
(function() {
var foo = 1;
})();
(function() {
if(foo == 1) alert("namespace separation failed!")
})();
我认为blog entry是一个很好的介绍。
您面临的第二个问题是如何避免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)
}