2016-09-14 4 views
1

У меня есть список, в котором каждая строка имеет не более 1 вложения, и я пытаюсь скопировать каждое вложение из этого списка в недавно созданную библиотеку изображений.Скопируйте несколько вложений из списка в библиотеку документов по javascript

Я могу скопировать вложение 1 следующим кодом,

var Files; 
var myContext; 
function CopyAtt(ItemID) { 
try { 
     myContext = new SP.ClientContext.get_current(); 
     var myWeb = myContext.get_site().get_rootWeb(); 

     var folderPath = 'Lists/test/Attachments/' + ItemID; 
     var Folder = myWeb.getFolderByServerRelativeUrl(folderPath); 

     Files = Folder.get_files(); 
     myContext.load(Files); 

     myContext.executeQueryAsync(Function.createDelegate(
            this, ExecuteCopyOnSuccess), 
            Function.createDelegate(
            this, GetLeadsFail));      
    } 
    catch (err) { 
     alert(err.Line); 
    } 
} 

function GetLeadsFail(sender, args) { 
    // Show error message 
    alert('GetLeadsFail() failed:' + args.get_message()); 
} 

function ExecuteCopyOnSuccess(sender, args) { 
    for (var p = 0; p < this.Files.get_count(); p++) { 
     var file = Files.itemAt(p); 
     var filename = file.get_name();  
    }  
    if (filename != null) { 
      var newUrl = 'PictureLibrary/' + filename; 
      file.copyTo(newUrl, true); 
      myContext.executeQueryAsync(null, null); 
    } 
} 
$(document).ready(function() { 
    CopyAtt(3); 
} 

Когда я пытаюсь вызвать CopyAtt(ItemID) кратные раз от $(document).ready, код показывает ошибки в консоли.

Uncaught TypeError: Cannot read property 'collectionHasNotBeenInitialized' of undefined 
Uncaught RangeError: Maximum call stack size exceeded 

Я подозреваю, что это связано с файлами, но я не могу найти какие-либо улики, может кто-нибудь дать мне несколько советов?

+0

На какие-либо из вложений есть апострофы в их именах? – Thriggle

+0

Нет, большинство из них - файлы jpg с буквами только имя. –

ответ

0

У меня есть решение через несколько дней, проблема не связана с файлами, но myContext.executeQueryAsync(null, null);.

Сначала я называю CopyAtt(ItemID) несколько раз,

for (i=0; i< Items.Length; i++){ 
     CopyAtt(Items[i]); 
    } 

executeQueryAsync() в CopyAtt(ItemID) сломается ошибки цикла и показать выше.

Вместо этого, рекурсия может избежать таких ошибок, и каждый executeQueryAsync() будет выполнен только после завершения.

function CopyAtt(Items, itemIndex) { 
try { 
     myContext = new SP.ClientContext.get_current(); 
     var myWeb = myContext.get_site().get_rootWeb(); 

     var folderPath = 'Lists/test/Attachments/' + Items[itemIndex]; 
     var Folder = myWeb.getFolderByServerRelativeUrl(folderPath); 

     Files = Folder.get_files(); 
     myContext.load(Files); 

     myContext.executeQueryAsync(Function.createDelegate(
           this, ExecuteLoadFileSuccess(Items, itemIndex);), 
           Function.createDelegate(
           this, GetLeadsFail));      
    } 
    catch (err) { 
     alert(err.Line); 
    } 
} 
function GetLeadsFail(sender, args) { 
    // Show error message 
    alert('Request failed - ' + args.get_message()); 
} 

function ExecuteLoadFileSuccess(Items, itemIndex, sender, args) { 

    for (var p = 0; p < this.Files.get_count(); p++) { 
     var file = Files.itemAt(p); 
     var filename = file.get_name(); 
    } 

    if (filename != null) { 
      var newUrl = 'PictureLibrary/' + filename; 
      file.copyTo(newUrl, true); 
      myContext.executeQueryAsync(Function.createDelegate(
            this, function(){ExecuteCopyOnSuccess(Items, itemIndex);}), 
            Function.createDelegate(
            this, GetLeadsFail)); 
    } 
} 

function ExecuteCopyOnSuccess(Items, itemIndex, sender, args) { 
    //Call CopyAtt() after copy files success. 
    if (itemIndex <Items.length-1) { 
    CopyAtt(Items, itemIndex+1); 
    } 
} 

$(document).ready(function() { 
     //save all Items ID in an array. 
     var Items = [2,3,6,7,8,10]; 
     CopyAtt(Items, 0); 
} 
+0

Знаете ли вы, как это можно скопировать в другой список, а не в библиотеку документов. – user388969

 Смежные вопросы

  • Нет связанных вопросов^_^