2016-03-15 46 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,我试图摆脱。我怀疑它与这个特定的网站或图书馆有关,我将在稍后进一步调查,但是我必须把这个推到门外。 –

相关问题