gpt4 book ai didi

javascript - 为什么我得到 "Uncaught TypeError: getEnumerator is not a function"?

转载 作者:行者123 更新时间:2023-12-02 15:34:04 25 4
gpt4 key购买 nike

在我的 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 获得了这段代码的基础.

但是出现了上面列出的错误(“Uncaught TypeError: oList.getEnumerator is not a function”);

一个答案说我需要添加以下内容:

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

...我将其从“15”更改为“14”,因为这是我们正在使用的文件夹/版本。

这不仅不起作用,而且未被识别。然后我发现了一条线索here ,即添加以下内容:

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

...但只有在已显示的错误之前有一个错误,即“Uncaught ReferenceError: CustomAction is not Defined””

那么有什么独家新闻吗? 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 未被用户代码处理 Message=服务器标记格式不正确。"

就我个人而言,我认为 Sharepoint 的结构不是很好。但这(正确)不是重点(没有双关语)。

最佳答案

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

getEnumerator() can only be called on a list item collection (不在 List 对象上),并且仅在通过运行 clientContext.executeQueryAsync() 填充了项目之后

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

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

  1. 创建您的上下文,指定您要访问的列表等。
  2. 运行clientContext.executeQueryAsync() (其中 clientContextSP.ClientContext 对象),并传入委托(delegate)函数以在成功或失败时运行
  3. 在“onSuccess”委托(delegate)函数中,您可以使用在第 1 步中加载的命令的结果

问题 3:您将无法直接从异步执行函数返回值

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

问题 4:列表项过滤效率低下

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

为此使用 CAML 查询; CAML(协作应用程序标记语言)是一种基于 XML 的查询语言,SharePoint 广泛使用。有大量用于编写 CAML 查询的资源和工具,如果您已经创建了与您的查询匹配的 View ,您甚至可以从 SharePoint ListView 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>元素来捕获您想要的其他两个过滤条件。

关于javascript - 为什么我得到 "Uncaught TypeError: getEnumerator is not a function"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33091343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com