0

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

4

2 に答える 2

1

$().SPServices非同期関数です。controls配列は、が呼び出されるまで入力されませ んparseList。ループを移動して、コントロールをparseListコールバックに追加します。

于 2012-07-09T21:38:45.350 に答える
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()関数に

于 2012-07-09T21:38:07.867 に答える