我有两个列表,一个在右边,一个在左边。当我点击左侧的节点时,它会执行以下操作:
1)AJAX请求$ .post的内容 服务器的节点
2)如果交易成功 服务器,节点移动到列表 在右边通过jQuery
发布到服务器:
$.post($(F).attr('action'), $(F).serialize(), null, "script");
将节点移动到另一个列表:
moveNode(element, to_list);
'element'和'to_list'是局部变量。我可以使moveNode成为回调函数,但如果事务不成功,我将不得不发布一堆错误消息,并且我的代码中的内容变得笨拙。我也希望服务器生成错误消息。
有没有办法在服务器响应中调用moveNode()?
答案 0 :(得分:2)
可能做你想做的事,但我不推荐它。方法如下:
function doTheThing() {
var element, to_list;
/* code here that gets element and to_list */
// Modify the post to use a callback and the "text" data type
$.post($(F).attr('action'), $(F).serialize(), handleMove, "text");
// Here's the callback
function handleMove(data) {
eval(data);
}
}
这是有效的,因为eval
非常特殊,并且它在调用它的范围内执行(以这种方式有点神奇),因此文本eval
中的代码评估有权访问调用eval
的范围内的所有变量。
略微偏离主题,但我建议采用基于数据的方法。也许:
function doTheThing() {
var element, to_list;
/* code here that gets element and to_list */
// Modify the post to use a callback and the "json" data type
$.post($(F).attr('action'), $(F).serialize(), handleMove, "json");
// Here's the callback
function handleMove(data) {
if (data.errorMessage) {
/* ...show the error... */
}
else {
moveNode(element, to_list);
}
}
}
...服务器要么返回:
{"errorMessage": "Don't move it!"}
或
{"success": true}
或在您的环境中有意义的任何内容。哎呀,如果它真的只是“它工作”或“这是一个错误”,你可以使用一个文本协议,其中“OK”意味着好,其他任何东西都是一个错误信息(互联网上充满了基于文本的协议) 。我更喜欢更多的结构,但关键是你有选择。
我会发现这种方法更容易维护。当您开始在层之间来回传递代码时,代码依赖于知道范围内变量的名称,这似乎是一个主要的紧密耦合问题。
答案 1 :(得分:1)
您可以使用错误消息解析回调中的服务器响应(可能是json编码),并使用布尔值来判断事务是否成功。然后根据响应运行你的moveNode()。
$.post($(F).attr('action'), $(F).serialize(), function(response) {
if (response.successful) {
alert('yay');
moveNode(element, to_list);
} else {
alert('Error: ' + response.error);
}
}, "json");