2014-10-08 56 views
1

我正在使用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 
    ); 
} 

回答

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.ClientContex t.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> 
+0

感謝您的建議。我試圖實現這一點,但現在我的查詢路由到失敗函數的每一次嘗試。我編輯我的OP來添加新的代碼(在註釋中沒有足夠的空間),以防我在實現中做了錯誤。 – 2014-10-08 20:02:17

+0

您的更新版本看起來好得多,這個錯誤發生是由於查詢中的錯字,請參閱更新的答案:) – 2014-10-08 20:50:17

+1

我發誓,至少90%的編碼錯誤是拼寫錯誤。非常感謝你的幫助。 (會投票,但我沒有足夠的聲譽。) – 2014-10-08 23:44:52

相關問題