3.3.5. 改造示例二:用Ajax.Request获取并处理数据
当从版本库下拉框(②)选择时,将触发更新授权路径的列表(③)。
原来的实现是提交整个表单并刷新整个页面,用AJAX改造后,
只更新授权路径的列表(③)部分。
虽然也可以用Ajax.Updater来更新整个授权路径列表,但为了演示另外一种Ajax处理方式,
以及获得更少的带宽占用和更快的响应,使用Ajax.Request来实现。
版本库下拉框(②)更新时,执行JavaScript函数:update_path(),而非提交表单:
函数update_path(),执行Ajax.Request,从"get_auth_path"这个action获取信息,
并用返回值(request.reponseText)为参数调用JavaScript函数ajax_update_path。
function update_path(form)
{
var repos = "";
if (form.reposinput[0].checked) {
repos = form.reposselector.options[form.reposselector.selectedIndex].value;
} else {
repos = form.reposname.value;
}
var params = {repos:repos};
showNoticesPopup();
new Ajax.Request(
'${h.url_for(controller="check", action="get_auth_path")}',
{asynchronous:true, evalScripts:true, method:'post',
onComplete:
function(request)
{ hideNoticesPopup();
ajax_update_path(request.responseText);},
parameters:params
});
}
函数ajax_update_path(),解析参数code,更新授权路径的下拉列表框。
本例非常简单,直接将参数(code)当作JavaScript代码并执行(eval函数),
这是因为Ajax.Request获取到的内容是字符串格式的JavaScript代码。
最终这些JavaScript代码在函数ajax_update_path中被执行,
并用相应的数据更新了授权路径的列表(③)。
function ajax_update_path(code)
{
var id = new Array();
var name = new Array();
var total = 0;
pathselector = document.forms[0].pathselector;
lastselect = pathselector.value;
pathselector.options.length = 0;
try {
eval(code);
for (var i=0; i < total; i++)
{
pathselector.options[i] = new Option(name[i], id[i]);
if (id[i]==lastselect)
pathselector.options[i].selected = true;
}
}
catch(exception) {
alert(exception);
}
}