getEnumerator失败,收集未初始化错误

时间:2014-10-08 16:32:18

标签: javascript sharepoint csom

我正在使用JSOM在特定列表中的特定项目的特定字段中查找值。总的来说,代码查找用户的组成员资格(使用SPServices),然后使用该值匹配列表中的项目(列表包含填充了组名称的“标题”字段和包含另一个字符串的“门户”字段)并尝试从该列表项中提取不同的值。我得到的错误是'var listItemEnumerator = this.listItems.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
    );
}

1 个答案:

答案 0 :(得分:0)

一些更正(错误发生可能是由于第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.ClientContext.executeQueryAsync接受回调功能

我建议使用以下常用方法。它允许通过指定List TitleCAML 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>