2016-03-15 28 views
0

我對這個錯誤或各種解決方案並不陌生,但是這個讓我撓了撓頭。我正在使用JavaScript對象模型來獲取給定文件夾中所有文件的所有列表。我在下面的代碼中得到getEnumerator的錯誤。我已經剝離下來的代碼,以最低限度:Sharepoint 2010 JSOM getEnumerator'集合尚未初始化。它沒有被要求......'

function getFilesInFolder() { 
    var folderServerRelativeUrl = folderPath + ID; 
    var context = new SP.ClientContext.get_current(); 
    var web = context.get_web(); 
    var list = web.get_lists().getByTitle(documentLibraryName); 
    var query = SP.CamlQuery.createAllItemsQuery(); 
    query.set_folderServerRelativeUrl(folderServerRelativeUrl); 

    //Update "web part" link 
    $("#doclink").attr('href',folderServerRelativeUrl); 
    files = list.getItems(query) 
    context.load(files, 'Include(Id)'); 
    context.executeQueryAsync(Function.createDelegate(this, this.OnSuccess), Function.createDelegate(this, this.OnFailure)); 
} 

function OnSuccess() 
{  
//ERROR Next Line:         
    var listItemEnumerator = this.files.getEnumerator(); 
    var table = $("#attachments"); 


    while (listItemEnumerator.moveNext()) 
    {          
     console.log("Found a file"); 
    }           
} 

的代碼是在文件的開頭稱爲例如: $(文件)。就緒(函數(){// 其他代碼。 .. ExecuteorDelayUntilScriptLoaded(getFilesInFolder,「sp.js」); });

我已經嘗試了大量的變化,並且它用於工作(不知道服務器或客戶端發生了什麼變化)。

回答

1

我試過你的代碼,因爲我無法看到任何明顯的錯誤,它的工作原理。 我使用Swedish編寫了FolderServerRelativeUrl: 「/ sites/intranet/dokument」是我的根網站和「Documents」文件夾。

你可以嘗試一下broswer「sitecollection/_api/web/getFolderByServerRelativeUrl('/ path/to/folder /')」 要查看你使用的url是否正確。

你也可以在onsuccess中設置一個斷點,並在控制檯中查找:files.get_count()來查看是否有任何結果。

你的負載很好,所以不要擔心!

function getFilesInFolder() { 
     var folderServerRelativeUrl = "/sites/intranet/dokument"; 
     var context = new SP.ClientContext.get_current(); 
     var web = context.get_web(); 
     var list = web.get_lists().getByTitle("Dokument"); 
     var query = SP.CamlQuery.createAllItemsQuery(); 
     query.set_folderServerRelativeUrl(folderServerRelativeUrl); 

     //Update "web part" link 
     // $("#doclink").attr('href',folderServerRelativeUrl); 
     files = list.getItems(query) 
     context.load(files, 'Include(Id)'); 
     context.executeQueryAsync(Function.createDelegate(this, this.OnSuccess), Function.createDelegate(this, this.OnFailure)); 
    } 

    function OnSuccess() 
    {  
    //ERROR Next Line:         
     var listItemEnumerator = this.files.getEnumerator(); 
     var table = $("#attachments"); 


     while (listItemEnumerator.moveNext()) 
     {          
      console.log("Found a file"); 
     }           
    } 
+0

感謝您的確認,我不確定我是否瘋了。 :)我應該提到我確實確認了路徑是正確的。我認爲瓦迪姆可能是正確的,我有範圍問題。我會讓你知道結果是什麼! –

1

該錯誤基本上意味着得到的對象(this.files變量)尚未從服務器請求一旦執行迭代。這個錯誤將通過同時執行多個查詢(基本上多次調用getFilesInFolder)來重現。

考慮到結果對象(this.files)的事實存儲在全球範圍(window對象),我會強烈建議對獲得列表項的這種做法,而不是你可以考慮將結果存儲在當地範圍爲以下證明:

function getFilesInFolder() { 
    var folderServerRelativeUrl = "/Documents/Archive"; 
    var context = new SP.ClientContext.get_current(); 
    var web = context.get_web(); 
    var list = web.get_lists().getByTitle(documentLibraryName); 
    var query = SP.CamlQuery.createAllItemsQuery(); 
    query.set_folderServerRelativeUrl(folderServerRelativeUrl); 
    var items = list.getItems(query) 
    context.load(items, 'Include(Id)'); 
    context.executeQueryAsync(
    function(){ 
     if(items.get_count() > 0) 
     {         
      console.log('Found a file(s)'); 
     }     
    }, 
    function(sender,args){ 
     console.log(args.get_message()); 
    }); 
} 

有了這種方法,你可以很容易地避免與覆蓋產生的對象,因此得到這個例外的衝突。

+1

謝謝,我會試試看。我現在得到的結果不一致,所以我懷疑這可能是這方面的一些問題。我沒有在代碼中的其他任何地方使用「文件」,但這並不意味着其他庫不會使用它,好的想法,謝謝!我會讓你(和世界)知道它是否有效。僅供參考,我使用的模式來自微軟的例子 - 它們實際上應該更新爲更適合您的想法,以避免這些範圍問題。 –

+0

如果仍然沒有工作,我最終使用SPServices,我試圖擺脫。我懷疑它與這個特定的網站或圖書館有關,我將在稍後進一步調查,但是我必須把這個推到門外。 –

相關問題