DojoX 有一个表单管理器来创建复杂的CRUD应用程序。基本上,它允许将平面 JSON 样式的对象映射到表单(读/写)、统一事件处理以及您希望使用表单动态执行的许多其他事情。它适用于 HTML 表单元素和类似的 Dijit 小部件。
例子:
dojo.require("dojox.form.Manager");
// our data
var data = {
name: "Bob Smith",
gender: "male"
};
// the form manager
var fm = new dojox.form.Manager({}, "my_form");
// now we can populate the form
fm.setFormValues(data);
// we can read them back when user submits them
// or indicated that she finished with them
var newData = fm.gatherFormValues();
// populate fields separately
fm.elementValue("name", "Jane Doe");
fm.elementValue("gender", "female");
// read a field value
var newName = fm.elementValue("name");
上述示例的 HTML 片段可能是这样的:
<fieldset id="my_form">
Name: <input type="text" name="name" value="">
<br>
Gender: <input type="text" name="gender" value="">
</fieldset>
或者它可以是这样的:
<fieldset id="my_form">
Name: <textarea name="name"></textarea>
<br>
Gender: <select name="gender">
<option value="male" >Male<option>
<option value="female">Female<option>
</select>
</fieldset>
或者它可以是这样的:
<fieldset id="my_form">
Name: <input type="text" name="name" value="">
<br>
Gender: <label><input type="radio" name="gender" value="male">Male</label>
<label><input type="radio" name="gender" value="female">Female</label>
</fieldset>
正如您所看到的,演示文稿与表单的机制几乎是分开的,因此您的 UI 设计师需要提供数据的最佳表示,并在不更改代码或打扰您的情况下无限调整表单。;-)
你还能做什么?还有很多其他的好东西:
// disable all fields temporarily
fm.disable();
// ...
// doing I/O here? we want to prohibit a user
// from modifying the form until we are done
// ...
// now we can enable all fields
fm.enable();
// sample field list
var fields = ["name"];
// we can enable/disable fields by name
fm.disable(fields);
// ...
fm.enable(fields);
// let's hide fields and show them back
fm.hide(fields);
// ...
fm.show(fields);
事件处理与底层表单元素/小部件无关:
// our business objective calls for pissing our users royally
// by popping an alert on every single field change
var my_alert = function(name, node){
var onChangeEventName = dojox.form.manager.changeEvent(node);
return dojo.connect(node, onChangeEventName, function(){
alert("Are you annoyed yet?");
}
};
var adapted = dojox.form.manager.actionAdapter(my_alert);
// let's apply our function to all fields
fm.inspect(adapted);
显然,我们可以启用/禁用/显示/隐藏/更多响应用户的操作,而不是激怒用户。
表单管理器包的功能远不止这些:观察者、表单处理、类快捷方式。整个事情被构建为一组 mixin,因此您可以只使用您真正需要的东西来创建自己的表单管理器。
从dojox.form.manager开始阅读它的文档,并点击 mixins 和dojox.form.Manager
(默认管理器类,它同时包含所有 mixin)的链接以获取更多详细信息。不要忘记查看表单管理器测试(警告:该测试针对调试进行了优化,启动速度可能很慢)。
是否可以使用非平面数据?是的。你有两个选择:
将其转换为一些平面结构,并在需要时返回。例子:
var data = {
name: {
first: "Bob",
last: "Smith"
}
};
可以转换为:
var data = {
"name-first": "Bob",
"name-last": "Smith"
};
使用多个表单管理器来处理不同的部分。
通常第一个选项更容易实现。只需对您的数据进行一些预处理和后处理。
如何进行输入验证、花哨的数据格式化或其他很酷的数据字段特定的事情?考虑使用 Dijit 小部件——它们可以做所有这些事情,甚至更多。