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
ようです。これはある種のスコーピングの問題だとしか思えません。どんな洞察も高く評価されます。