0

私の問題は次のとおりです。

サイト コレクション ルートの下に、'Project Register' というプロジェクトを表すリストがあります。そのリストの各項目は、プロジェクト名、ステータス、URL、およびその他のプロパティを格納しているプロジェクトを表しています。各アイテムには、Visual Studio で作成されたカスタム イベント レシーバーを介して動的に作成される同じサイト コレクションの下に、対応する SharePoint サブ サイトがあるため、URL が保存されます。

各プロジェクト サブ サイトには、そのプロジェクトに割り当てられた人々を追跡するために使用される「メンバー」と呼ばれるリストがあります。これはビジネス要件であり、このリストはこの質問の範囲外の他の目的に使用されます。

今、私の課題は、「タイムシート」と呼ばれる別のリストのドロップダウンリストに、ログインしたユーザーが割り当てられているプロジェクトを表示する必要があることです。これは、ユーザーがこれらのプロジェクトに費やした時間を入力できるようにするためです。このタイムシート リストは、いくつかのカスタム フィールドを備えたすぐに使用できる SharePoint 予定表リストに他なりません。

以下は私が使用しているコードですが、メンバーリストを取得するときに次のエラーが発生し続けます。

キャッチされていない TypeError: 未定義のメソッド 'apply' を呼び出せません

誰かが私を正しい方向に向けることができますか?

使用しているコードは、マスター ページで適切に参照したカスタム .js ファイルにあります。

 $(document).ready(function () {

    SP.SOD.executeOrDelayUntilScriptLoaded(loadMyProjects,'SP.js');

 });

    var $ddlMyProjectsNewItem;
    var allProjects = new Array();

    function loadMyProjects()
    {

    $ddlMyProjectsNewItem = $("#ctl00_ctl32_g_03acc13b_954d_4bdc_9544_b379206bc9d5_ctl00_ctl05_ctl00_ctl00_ctl00_ctl04_ctl00_Lookup");
    var isTimesheetNewForm = $ddlMyProjectsNewItem.attr("id") != undefined ? true : false;

    if(!isTimesheetNewForm)
    {
        return;
    }

    $ddlMyProjectsNewItem.empty();


    // Get the current client context.
    var clientContext = SP.ClientContext.get_current();
    var web = clientContext.get_web();

    var list = web.get_lists().getByTitle('Project Register'); 
    var camlQuery = new SP.CamlQuery();

   camlQuery.set_viewXml("<View>" +
   "<ViewFields>" +
        "<FieldRef Name='Full_x0020_Project_x0020_Name' />" +
        "<FieldRef Name='ID' />" +
        "<FieldRef Name='Links' />" +
    "</ViewFields>" +
    "<Query>" +
        "<Where>" +
            "<Eq>" +
                "<FieldRef Name='Status' />" +
                "<Value Type='Lookup'>WIP</Value>" +
            "</Eq>" +
       "</Where>"+
        "<OrderBy>" +
            "<FieldRef Name='Full_x0020_Project_x0020_Name' Ascending='FALSE' />" +
        "</OrderBy>" + 
    "</Query>" +
    "</View>");

    this.collListItem = list.getItems(camlQuery);

    clientContext.load(collListItem);

    clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectsQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));        

}

function onProjectsQuerySucceeded(sender, args) {

    var listItemEnumerator = collListItem.getEnumerator();

    while (listItemEnumerator.moveNext()) {

        var oListItem = listItemEnumerator.get_current();
        var projectId = oListItem.get_id();
        var projectName = oListItem.get_item('Full_x0020_Project_x0020_Name');
        var projectUrl = oListItem.get_item('Links');

        allProjects.push(projectId + "|" + projectName  + "|" + projectUrl);
    }

    $.each( allProjects, function( key, value ) {

        var projectMembers = new ProjectSiteMembers(value);
        projectMembers.get_members();

    });  

}

function ProjectSiteMembers(projectData) {
   // console.log(projectData);

    var projectValues = projectData.split('|');
    this.projectId = projectValues[0];
    this.projectName = projectValues[1];
    this.projectUrl = projectValues[2];

    this.clientContext = null;
    this.website = null;
    this.membersList = null;
    this.collListItemMembers = null;    
}

// Define the class methods.
ProjectSiteMembers.prototype = {
    get_members: function () {

        //console.log(this.projectUrl);

        this.clientContext = new SP.ClientContext(this.projectUrl);
        this.website = this.clientContext.get_web();

        this.membersList = this.clientContext.get_web().get_lists().getByTitle('Members')


        var camlQuery = new SP.CamlQuery();
        camlQuery.set_viewXml("<View>" +
   "<ViewFields>" +
        "<FieldRef Name='Member' />" +
    "</ViewFields>" +
    "<Query>" +
        "<Where>" +
            "<Eq>" +
                "<FieldRef Name='Member' />" +
                "<Value Type='Integer'>" +
                    "<UserID Type='Integer' />" +
         "      </Value>" +
            "</Eq>" +
        "</Where>"+
    "</Query>" +
    "</View>");

        this.collListItemMembers = this.membersList.getItems(camlQuery);

        this.clientContext.load(this.collListItemMembers);

            // Everything works until this point
            // This is the line giving me the error
        this.clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectMembersQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));           
    }
};


function onProjectMembersQuerySucceeded(sender, args) {

    //console.log(this.projectId + " - " + this.projectName);

    var listItemInfoMember = '';

    var listItemMemberEnumerator = collListItemMembers.getEnumerator();

    while (listItemMemberEnumerator.moveNext()) {
        var oListItemMember = listItemMemberEnumerator.get_current();


            $ddlMyProjectsNewItem 
                .append('<option value="' + this.projectId + '">' + this.projectName + '</option>');

    }        
}

function onQueryFailed(sender, args) {

    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
4

1 に答える 1

1

同僚とのレビューの後、問題を解決することができました。javascript クラスのスコープで定義されていないメソッドを不適切に呼び出していたようです。これらは、見落としているために数時間悩まされるようなばかげた間違いです。

以下は、リファクタリング後の実際の作業コードです。将来の参照用に誰でもここに置くことができます。

 $(document).ready(function () {

    SP.SOD.executeOrDelayUntilScriptLoaded(loadMyProjects,'SP.js');

 });

    var $ddlMyProjects;
    var $ddlMyProjectsNewItem;
    var $ddlMyProjectsEditItem;
    var allProjects = new Array();

    function loadMyProjects()
    {

    $ddlMyProjectsNewItem = $("#ctl00_ctl32_g_03acc13b_954d_4bdc_9544_b379206bc9d5_ctl00_ctl05_ctl00_ctl00_ctl00_ctl04_ctl00_Lookup");
    $ddlMyProjectsEditItem= $("#ctl00_ctl32_g_23803b04_bdec_4c98_a4af_0b863da464c1_ctl00_ctl05_ctl00_ctl00_ctl00_ctl04_ctl00_Lookup");
    var isTimesheetNewForm = $ddlMyProjectsNewItem.attr("id") != undefined ? true : false;
    var isTimesheetEditForm = $ddlMyProjectsEditItem.attr("id") != undefined ? true : false;

    if(isTimesheetNewForm)
    {
        $ddlMyProjects = $ddlMyProjectsNewItem;
    }
    else if(isTimesheetEditForm)
    {
        $ddlMyProjects = $ddlMyProjectsEditItem;
    }
    else
    {
        return;
    }


    $ddlMyProjects.empty();


    // Get the current client context.
    var clientContext = SP.ClientContext.get_current();
    var web = clientContext.get_web();

    var list = web.get_lists().getByTitle('Project Register'); 
    var camlQuery = new SP.CamlQuery();

   camlQuery.set_viewXml("<View>" +
   "<ViewFields>" +
        "<FieldRef Name='Full_x0020_Project_x0020_Name' />" +
        "<FieldRef Name='ID' />" +
        "<FieldRef Name='Links' />" +
    "</ViewFields>" +
    "<Query>" +
        "<Where>" +
            "<Eq>" +
                "<FieldRef Name='Status' />" +
                "<Value Type='Lookup'>WIP</Value>" +
            "</Eq>" +
       "</Where>"+
        "<OrderBy>" +
            "<FieldRef Name='Full_x0020_Project_x0020_Name' Ascending='TRUE' />" +
        "</OrderBy>" + 
    "</Query>" +
    "</View>");

    this.collListItem = list.getItems(camlQuery);

    clientContext.load(collListItem);

    clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectsQuerySucceeded), Function.createDelegate(this, this.onProjectsQueryFailed));        

}

function onProjectsQuerySucceeded(sender, args) {

    var listItemEnumerator = collListItem.getEnumerator();

    while (listItemEnumerator.moveNext()) {

        var oListItem = listItemEnumerator.get_current();
        var projectId = oListItem.get_id();
        var projectName = oListItem.get_item('Full_x0020_Project_x0020_Name');
        var projectUrl = oListItem.get_item('Links');

        allProjects.push(projectId + "|" + projectName  + "|" + projectUrl);
    }

    $.each( allProjects, function( key, value ) {

        var projectMembers = new ProjectSiteMembers(value);
        projectMembers.get_members();

    });  

}

function onProjectsQueryFailed(sender, args) {

    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}  

function ProjectSiteMembers(projectData) {
   // console.log(projectData);

    var projectValues = projectData.split('|');
    this.projectId = projectValues[0];
    this.projectName = projectValues[1];
    this.projectUrl = projectValues[2];

    this.clientContext = null;
    this.website = null;
    this.membersList = null;
    this.collListItemMembers = null;    
}

// Define the class methods.
ProjectSiteMembers.prototype = {

    onProjectMembersQuerySucceeded: function (sender, args) {

        console.log(this.projectId + " - " + this.projectName);

        var listItemInfoMember = '';

        var listItemMemberEnumerator = this.collListItemMembers.getEnumerator();

        while (listItemMemberEnumerator.moveNext()) {
            var oListItemMember = listItemMemberEnumerator.get_current();

                $ddlMyProjects.append('<option value="' + this.projectId + '">' + this.projectName + '</option>');
                return false;

        }        
    },

    onProjectMembersQueryFailed: function onQueryFailed(sender, args) {

        alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
    },  

    get_members: function () {

        console.log(this.projectUrl);

        this.clientContext = new SP.ClientContext(this.projectUrl);
        this.website = this.clientContext.get_web();

        this.membersList = this.clientContext.get_web().get_lists().getByTitle('Members')


        var camlQuery = new SP.CamlQuery();
        camlQuery.set_viewXml("<View>" +
   "<ViewFields>" +
        "<FieldRef Name='Member' />" +
    "</ViewFields>" +
    "<Query>" +
        "<Where>" +
            "<Eq>" +
                "<FieldRef Name='Member' />" +
                "<Value Type='Integer'>" +
                    "<UserID Type='Integer' />" +
         "      </Value>" +
            "</Eq>" +
        "</Where>"+ 
    "</Query>" +
    "</View>");

        this.collListItemMembers = this.membersList.getItems(camlQuery);

        this.clientContext.load(this.collListItemMembers );

        this.clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectMembersQuerySucceeded), Function.createDelegate(this, this.onProjectMembersQueryFailed));           
    }
};
于 2013-07-22T05:14:39.967 に答える