getEnumerator失败,集合未初始化错误
问题描述:
我正在使用JSOM在特定列表中特定项目的特定字段中查找值。总的来说,代码查找用户的组成员资格(使用SPServices),然后使用该值来匹配列表中的项目(列表包含填充组名称的“标题”字段和包含另一字符串的“门户”字段)并尝试从该列表项拉取不同的值。我得到的错误是'var listItemEnumerator = this.listItems.getEnumerator();'。错误是“收集尚未初始化,尚未请求收集或请求尚未执行,可能需要明确请求。”getEnumerator失败,集合未初始化错误
下面是代码:
function getPortalURL(userGroup) {
var URL = "";
var ctx = new SP.ClientContext.get_current();
var list = ctx.get_web().get_lists().getByTitle('Clients');
var query = "<View><Query><Where><Eq><FieldRef Name='Title'><Value Type='Text'>" + userGroup + "</Value></Eq></Where></Query></View>";
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(query);
this.listItems = list.getItems(camlQuery);
ctx.load(this.listItems);
ctx.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded(URL)), Function.createDelegate(this, this.onQueryFailed));
return URL;
}
function onQuerySucceeded(URL) {
var listItemEnumerator = this.listItems.getEnumerator();
while (listItemEnumerator.moveNext()) {
var currentItem = listItemEnumerator.get_current();
URL = currentItem.get_item('Portal');
}
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
编辑: 我已经更新了我的代码,以反映下面的变化,但现在我看到查询失败的每次尝试,始终路由到故障的功能。下面是情况下,代码我做错了什么事在我的实现:
function getPortalURL(userGroup) {
var query = "<View><Query><Where><Eq><FieldRef Name='Title'><Value Type='Text'>" + userGroup + "</Value></Eq></Where></Query></View>";
getListItems('Clients', query,
function(items) {
if(items.get_count() === 1) {
var item = items.getItemAtIndex(0);
alert(item.get_item('Portal'));
}
},
function(sender,args){
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
);
}
function getListItems(listTitle, queryText, success, error) {
var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
var list = web.get_lists().getByTitle(listTitle);
var query = new SP.CamlQuery();
query.set_viewXml(queryText);
var items = list.getItems(query);
ctx.load(items);
ctx.executeQueryAsync(
function() {
success(items);
},
error
);
}
答
一些修改(可能的发生是由于第3项)中的错误:
var ctx = SP.ClientContext.get_current(); //since new constructor is not needed
- return语句已被删除因为
SP.ClientContext.executeQueryAsync
是异步方法 - 取代
ctx.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded(URL)), Function.createDelegate(this, this.onQueryFailed));
到ctx.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
因为SP.ClientContex t.executeQueryAsync接受回调功能
我建议可以利用以下常见方法来代替。它允许通过指定List Title
和CAML query
加载列表项:
function getListItems(listTitle,queryText, success,error){
var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
var list = web.get_lists().getByTitle(listTitle);
var query = new SP.CamlQuery();
query.set_viewXml(queryText);
var items = list.getItems(query);
ctx.load(items);
ctx.executeQueryAsync(
function() {
success(items);
},
error
);
}
使用
从页面列表加载列表项和打印第一招:
getListItems('Pages','<View><Query/></View>',
function(items){
if(items.get_count() > 0) {
var firstItem = items.getItemAtIndex(0);
console.log(firstItem.get_item('Title'));
}
},
function(sender,args){
console.log(args.get_message());
}
);
在你的情况下,由于特定的项目必须找到,可以使用以下示例:
getListItems('<List Title>','<Your query goes here>',
function(items){
if(items.get_count() === 1) { //Is item found?
var item = items.getItemAtIndex(0);
console.log(item.get_item('<Field Name>'));
}
},
function(sender,args){
console.log(args.get_message());
}
);
更新
有查询一个错字,固定查询:
<View><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + userGroup + "</Value></Eq></Where></Query></View>
感谢您的建议。我试图实现这一点,但现在我的查询路由到失败函数的每一次尝试。我编辑我的OP来添加新的代码(在注释中没有足够的空间),以防我在实现中做了错误。 – 2014-10-08 20:02:17
您的更新版本看起来好得多,这个错误发生是由于查询中的错字,请参阅更新的答案:) – 2014-10-08 20:50:17
我发誓,至少90%的编码错误是拼写错误。非常感谢你的帮助。 (会投票,但我没有足够的声誉。) – 2014-10-08 23:44:52