我为什么会这样,“Uncaught TypeError:getEnumerator不是函数”?

时间:2015-10-12 22:39:41

标签: 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();
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);

我从here获得了此代码的基础。

但是上面列出了错误(“未捕获的TypeError:oList.getEnumerator不是函数”);

一个答案说我需要补充一下:

<script type="text/javascript" src="/_layouts/15/sp.js" ></script>

...我从“15”变为“14”,因为那是我们正在使用的文件夹/版本。

这不仅没有奏效,而且未被承认。然后我找到了一条线索here,即添加这个:

$(document).ready(function () { ExecuteOrDelayUntilScriptLoaded(CustomAction, "sp.js"); });

...但是只有在已经显示的错误之前的错误,即“未捕获的ReferenceError:CustomAction未定义

那么什么是独家新闻? getEnumerator()需要什么,或以其他方式检索我需要的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 '';
}

更新

当我尝试这个时(第一行和第三行是新的):

<SharePoint:ScriptLinkID="ScriptLink1" Name="SP.js" runat="server" OnDemand="false" LoadAfterUI="true" Localizable="false"></SharePoint:ScriptLink>
<script type="text/javascript">
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', sharePointReady);

...受到了猫here的启发,我得到了,“ System.Web.HttpParseException未被用户代码处理   消息=服务器标签格式不正确。

就个人而言,我认为Sharepoint并不是很好。但那是(右)旁边的点(没有双关语)。

2 个答案:

答案 0 :(得分:1)

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

getEnumerator() can only be called on a list item collection(不在列表对象上),并且只有在通过运行clientContext.executeQueryAsync()

填充了项目之后

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

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

  1. 创建您的上下文,指定您要访问的列表等。
  2. 运行clientContext.executeQueryAsync()(其中clientContextSP.ClientContext个对象),并传递委托函数以在成功或失败时运行
  3. 在你的&#34; onSuccess&#34;委托功能,您可以使用在步骤1中加载的命令的结果
  4. 问题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");
    

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

答案 1 :(得分:1)

这最终对我有用,感谢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());
        })
    );
}