因为ajax是异步加载数据的,所以有时候在一个ajax中调用另一个ajax方法时,需要考虑两者不同步的问题。比如下面这个例子:
//加载用户
$.ajax({
url : 'user/findUserById',
type : 'POST',
data : {userId:'${param.uid}'},
success:function(data){
var users = [{user:data,role:'',certificate:''}];
users[0].role=rolesData(data);
certificatesData(data,users);
//vm.users(users);
}
});
//处理证书信息
function certificatesData(user,users){
$.ajax({
url : 'certificate/getAllCertificate',
type : 'post',
success:function(data){
var arr = eval('('+data+')');
for(var i=0;i<arr.length;i++) {
if(user.certificate_id == arr[i].id) {
users[0].certificate = arr[i].name;
}
}
vm.users(users);
}
});
}
这里用的是knockout.js来做的数据回显。vm是viewModel,在里面定义了一个users监控数组。加载用户的ajax用来加载用户的数据,里面定义的users数组是用来填充ko里的users监控数组的。certificatesData函数先加载出所有的证书,然后找出用户拥有的证书名称,并把名称赋给users的certificate属性。将这些数据都绑定到ko里面后,用ko在form表单中进行数据回显。
vm.users(users);
用来绑定数据,一开始是在加载用户的ajax的success函数中执行的。但这样做在表单中是显示不出证书的数据的。因为两个ajax是异步执行的,ko在表单回显结束后,certificatesData函数还没有加载完证书数据,所以ko中是没有证书 的数据的。
解决办法是,把vm.users(users);
这一步放在certificatesData函数的success方法中执行,这样才能保证证书数据能够放到viewModel后再回显。