我正在尝试编写一些基于Sharepoint WebServices getList响应构建html控件的javascript。我将控件存储在一个数组中。构建数组后,长度为0,直到我执行警报,然后它变为正确的数字。
var controls = [];
$(document).ready(function() {
// Make call to WebServices to retrieve list data
$().SPServices({
operation: "GetList",
listName: qs["list"],
completefunc: parseList
});
console.log(controls.length); // this outputs 0
alert("This has to be here to work."); // this has to be here, no idea why
console.log(controls.length); // this outputs 6
for (var i=0; i<controls.length; i++) {
controls[i].addControl();
}
});
function parseList(xData,status) {
$(xData.responseXML).find("Field").each(function() {
if ($(this).attr("ID") && $(this).attr("SourceID") != "http://schemas.microsoft.com/sharepoint/v3") {
if ($(this).attr("Type") == "Text") {
controls.push(new Textbox(this));
} else if ($(this).attr("Type") == "Choice" && $(this).attr("Format") == "Dropdown") {
controls.push(new Dropdown(this));
} else if ($(this).attr("Type") == "Choice" && $(this).attr("Format") == "RadioButtons") {
controls.push(new RadioButtons(this));
} else if ($(this).attr("Type") == "MultiChoice") {
controls.push(new MultiChoice(this));
} else if ($(this).attr("Type") == "Boolean") {
controls.push(new Boolean(this));
}
}
});
}
警报似乎是使controls.length
正常工作的唯一因素。我只能认为这是某种范围问题。任何见解都表示赞赏。
答案 0 :(得分:1)
这可能是由于这个异步代码
$().SPServices({
operation: "GetList",
listName: qs["list"],
completefunc: parseList
});
警报暂时停止线程执行,以允许调用回调函数
所以试着移动这部分
console.log(controls.length); // this outputs 6
for (var i=0; i<controls.length; i++) {
controls[i].addControl();
}
进入parseList()
函数
答案 1 :(得分:1)
$().SPServices
是一个异步函数。在调用controls
之前,不会填充parseList
数组。移动循环以将控件添加到parseList
回调。