Javascript “为什么我会这样?”;未捕获的TypeError:getEnumerator不是函数";?

Javascript “为什么我会这样?”;未捕获的TypeError:getEnumerator不是函数";?,javascript,jquery,sharepoint-2010,web-parts,Javascript,Jquery,Sharepoint 2010,Web Parts,在我的Sharepoint 2010 Web部件中,我有以下Javascript: function getListItemID(username, payeename, oList) { var arrayListEnum = oList.getEnumerator(); …这被称为: function upsertPostTravelListItemTravelerInfo1() { var clientContext = SP.ClientContext.get_current(

在我的Sharepoint 2010 Web部件中,我有以下Javascript:

function getListItemID(username, payeename, oList) {
    var arrayListEnum = oList.getEnumerator();
…这被称为:

function upsertPostTravelListItemTravelerInfo1() {
var clientContext = SP.ClientContext.get_current();
var oList =   
  clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');

this.website = clientContext.get_web();
currentUser = website.get_currentUser();

var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);

var travelersEmail = $('traveleremail').val();

/* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem.  */
listId = getListItemID(currentUser, travelersEmail, oList);
我从中得到了这个代码的基础

但是得到了上面列出的错误(“uncaughttypeerror:oList.getEnumerator不是函数”)

一个回答说我需要补充一点:

<script type="text/javascript" src="/_layouts/15/sp.js" ></script>
$(document).ready(function () { ExecuteOrDelayUntilScriptLoaded(CustomAction, "sp.js"); });
…但只有在已经显示的错误之前有一个错误,即“未捕获引用错误:未定义CustomAction”

那么独家新闻是什么?获取Enumerator()或以其他方式检索所需的ID值需要什么

下面是该方法的完整代码,以显示我试图完成的内容以及如何完成:

function getListItemID(username, payeename, oList) {
  var arrayListEnum = oList.getEnumerator();

  while (arrayListEnum.moveNext()) {
     var listItem = arrayListEnum.get_current();

     if (listItem.get_item("ptli_formPreparedBy") === username &&
         listItem.get_item("ptli_TravelersEmail") === payeename &&
         listItem.get_item("ptli_formCompleted") == false) {
       return listItem.get_id();    
     }
   }
   return '';
}
更新 当我尝试这个(第一行和第三行是新的):


SP.SOD.executeFunc('SP.js','SP.ClientContext',sharePointReady);
…这是受一只猫的启发,我得到,“System.Web.HttpParseException未经用户代码处理 Message=服务器标记的格式不正确。“


就我个人而言,我认为Sharepoint的格式不是很好。但这(对)不是重点(不是双关语)。

问题1:您在列表上调用getEnumerator,而不是列表项集合

getEnumerator()
(不在列表对象上),并且仅在通过运行
clientContext.executeQueryAsync()

问题2:需要调用executeQueryAsync来填充列表项集合

在使用SharePoint JavaScript客户端对象模型时,您的代码需要分为两部分:第一部分指定要获取的内容,包括将查询和命令加载到SPClientContext对象中;第二部分允许您操作到SharePoint的查询结果,并作为查询执行的异步回调运行

  • 创建上下文,指定要访问的列表,等等
  • 运行
    clientContext.executeQueryAsync()
    (其中
    clientContext
    SP.clientContext
    对象),并传入委托函数以在成功或失败时运行
  • 在“onSuccess”委托函数中,可以使用步骤1中加载的命令的结果
  • 问题3:无法直接从异步执行的函数返回值

    因为上面的步骤3是异步运行的,所以无法从中获取返回值。任何依赖于步骤3中得到的结果的逻辑都需要在执行链中向前移动,使用函数委托和回调

    问题4:列表项的筛选效率低下

    这实际上更像是一个设计缺陷,而不是一个停止显示的问题,但是您不应该让代码返回列表中的每个项目,然后使用JavaScript枚举结果以查看您想要的项目是否在其中,您应该在SharePoint执行查询之前告诉它您想要什么过滤器选项。然后,它将只提供与查询匹配的项

    为此使用CAML查询;CAML(协作应用程序标记语言)是SharePoint广泛使用的基于XML的查询语言。有大量的资源和工具用于组合CAML查询,如果已经创建了与查询匹配的视图,甚至可以从SharePoint列表视图web部件中窃取CAML查询

    如何使用JavaScript CSOM查询SharePoint列表的示例

    下面是一个使用部分代码的示例:

    /* 
       ExecuteOrDelayUntilScriptLoaded(yourcode,"sp.js") makes sure 
       your code doesn't run until SP.js (the SharePoint JavaScript CSOM) 
       has been loaded
    */
    ExecuteOrDelayUntilScriptLoaded(function(){
        var payeename = $('traveleremail').val();
        var clientContext = SP.ClientContext.get_current();
        var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
    
        /* Use a CAML query to filter your results */
        var camlQuery = new SP.CamlQuery();
        camlQuery.set_viewXml('<View><Query><Where><Eq><FieldRef Name=\'ptli_TravelersEmail\' /><Value Type=\'Text\'>'+payeename+'</Value></Eq></Where></Query></View>');
    
        /* get the list item collection from the list */
        var oListItems = oList.getItems(camlQuery);
    
        /* tell SharePoint to load the list items */
        clientContext.load(oListItems);
    
        /* execute the query to get the loaded items */
        clientContext.executeQueryAsync(
            /* onSuccess Function */ 
            Function.createDelegate(this,function(){
                /* 
                   now that the query has run, you can get an enumerator 
                   from your list item collection 
                */
                var arrayListEnum = oListItems.getEnumerator();
                var ids = [];
                while(arrayListEnum.moveNext()){
                    var listItem = arrayListItem.get_current();
                    ids.push(listItem.get_id());
                }
                alert(ids.length > 0 ? "IDs of matching items: " + ids : "No matching items found!");
            }),
            /*onFailure Function*/ 
            Function.createDelegate(this,function(sender,args){
                alert("Whoops: " + args.get_message() + " " + args.get_stackTrace());
            })
        );
    },"sp.js");
    
    /*
    ExecuteOrderLayUntilScriptLoaded(您的代码“sp.js”)确保
    您的代码在SP.js(SharePoint JavaScript CSOM)之前不会运行
    已加载
    */
    ExecuteOrderLayUntilScriptLoaded(函数(){
    var payeName=$('traveleremail').val();
    var clientContext=SP.clientContext.get_current();
    var oList=clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
    /*使用CAML查询筛选结果*/
    var camlQuery=new SP.camlQuery();
    camlQuery.set_viewXml(“”+payeName+“”);
    /*从列表中获取列表项集合*/
    var oListItems=oList.getItems(camlQuery);
    /*告诉SharePoint加载列表项*/
    clientContext.load(oListItems);
    /*执行查询以获取加载的项*/
    clientContext.executeQueryAsync(
    /*onSuccess函数*/
    createDelegate(这个,函数(){
    /* 
    现在查询已经运行,您可以获得一个枚举数
    从列表项集合中
    */
    var arrayListEnum=oListItems.getEnumerator();
    var-id=[];
    while(arrayListEnum.moveNext()){
    var listItem=arrayListItem.get_current();
    id.push(listItem.get_id());
    }
    警报(ids.length>0?“匹配项的ID:+ids:“未找到匹配项!”);
    }),
    /*onFailure函数*/
    createDelegate(此,函数(发送方,参数){
    警报(“呜呼:“+args.get_message()+”+args.get_stackTrace());
    })
    );
    },“sp.js”);
    

    示例代码中的CAML查询仅过滤ptli_TravelersEmail列;您需要添加一些
    元素来捕获所需的其他两个过滤条件。

    这是Thriggle最终对我起作用的原因:

    function setListItemID(username, payeename) {
        var clientContext = new SP.ClientContext.get_current();
        var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
    
        /* Use a CAML query to filter your results */
        var camlQuery = new SP.CamlQuery();
        camlQuery.set_viewXml('<View><Query><Where><Eq><FieldRef Name=\'ptli_TravelersEmail\' /><Value Type=\'Text\'>' + payeename + '</Value></Eq></Where></Query></View>');
    
        /* get the list item collection from the list */
        var oListItems = oList.getItems(camlQuery);
    
        /* tell SharePoint to load the list items */
        clientContext.load(oListItems);
    
        /* execute the query to get the loaded items */
        clientContext.executeQueryAsync(
            /* onSuccess Function */
            Function.createDelegate(this, function () {
                /* 
                now that the query has run, you can get an enumerator 
                from your list item collection 
                */
                var arrayListEnum = oListItems.getEnumerator();
                var ids = [];
                while (arrayListEnum.moveNext()) {
                    var listItem = arrayListItem.get_current();
                    ids.push(listItem.get_id());
                }
                if (ids.length > 0) {
                    listId = ids[0];
                }
                else {
                    listId = '';
                }
            }),
            /*onFailure Function*/
            Function.createDelegate(this, function (sender, args) {
                alert("Whoops: " + args.get_message() + " " + args.get_stackTrace());
            })
        );
    }
    
    函数setListItemID(用户名、收款人名称){
    var clientContext=new SP.clientContext.get_current();
    var oList=clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
    /*使用CAML查询筛选结果*/
    var camlQuery=new SP.camlQuery();
    camlQuery.set_viewXml(“”+payeName+“”);
    /*从列表中获取列表项集合*/
    var oListItems=oList.getItems(camlQuery);
    /*告诉SharePoint加载列表项*/
    clientContext.load(oListItems);
    /*执行查询以获取加载的i
    
    function setListItemID(username, payeename) {
        var clientContext = new SP.ClientContext.get_current();
        var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
    
        /* Use a CAML query to filter your results */
        var camlQuery = new SP.CamlQuery();
        camlQuery.set_viewXml('<View><Query><Where><Eq><FieldRef Name=\'ptli_TravelersEmail\' /><Value Type=\'Text\'>' + payeename + '</Value></Eq></Where></Query></View>');
    
        /* get the list item collection from the list */
        var oListItems = oList.getItems(camlQuery);
    
        /* tell SharePoint to load the list items */
        clientContext.load(oListItems);
    
        /* execute the query to get the loaded items */
        clientContext.executeQueryAsync(
            /* onSuccess Function */
            Function.createDelegate(this, function () {
                /* 
                now that the query has run, you can get an enumerator 
                from your list item collection 
                */
                var arrayListEnum = oListItems.getEnumerator();
                var ids = [];
                while (arrayListEnum.moveNext()) {
                    var listItem = arrayListItem.get_current();
                    ids.push(listItem.get_id());
                }
                if (ids.length > 0) {
                    listId = ids[0];
                }
                else {
                    listId = '';
                }
            }),
            /*onFailure Function*/
            Function.createDelegate(this, function (sender, args) {
                alert("Whoops: " + args.get_message() + " " + args.get_stackTrace());
            })
        );
    }