2015-09-24 3 views
0

Я запрашиваю содержимое управляемых метаданных, используя следующий код. Я встретив ошибкуОШИБКА: коллекция не была инициализирована

The collection has not been initialized

, когда я нахожусь в var level2TermsEnum = level2Terms.getEnumerator();

Я прочитал, что это из-за отсроченной и обещание JavaScript, и я не могу понять это. Может быть, вы могли бы помочь мне пролить свет здесь.

$(document).ready(function() { 

     var scriptbase = _spPageContextInfo.webServerRelativeUrl + "/_layouts/15/"; 

     $.getScript(scriptbase + "SP.Runtime.js", 

     function() { 

      $.getScript(scriptbase + "SP.js", function() { 

       $.getScript(scriptbase + "SP.Taxonomy.js", function() { 

        context = SP.ClientContext.get_current(); 
        var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context); 

        //Term Stores 
        var termStores = taxSession.get_termStores(); 
        //Term Store under which to create the group. 
        var termStore = termStores.getByName("Managed Metadata Service"); 
        var termSet = termStore.getTermSet("7b6ee52v-3709-4181-a14d-b953f2ad0aad"); 
        //Call your code here. 

        GetTermsFromTaxonomyStore(); 
       }); 

      }); 

     }); 

     var json = ""; 
     function GetTermsFromTaxonomyStore() { 

      //Current Context 
      var context = SP.ClientContext.get_current(); 
      //Current Taxonomy Session 
      var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context); 
      var termStores = taxSession.get_termStores(); 
      //Term Store under which to create the term. 
      //var termStore = taxSession.getDefaultSiteCollectionTermStore(); 
      var termStore = termStores.getByName("Managed Metadata Service"); 
      //Pass ID of the Meetings Term Set 
      var termSet = termStore.getTermSet("7b6ee52v-3709-4181-a14d-b953f2ad0aad"); 
      var terms = termSet.get_terms(); 
      context.load(terms); 
      context.executeQueryAsync(function() { 
       var level1Terms = terms.getEnumerator(); 
       while (level1Terms.moveNext()) { //iterate thru Level1 
        var level1 = level1Terms.get_current(); 
        if (level1.get_termsCount() > 0) { //check if Level1 has child 
         var level2Terms = level1.get_terms(); //get level2 terms of level 1 term 
         **var level2TermsEnum = level2Terms.getEnumerator();** 
         while (level2TermsEnum.moveNext()) 
         { 
          var level2Term = level2TermsEnum.get_current(); 
          var level2TermName = level2Term.get_name(); 
          termsList += '"Level1":"' + level2Term.get_name() + '","Level2":"' + level2TermName + '"'; 
         } 

        } 
        //console.log(currentTerm.get_name()); 
       } 
       alert(termsList); 

      }, function (sender, args) { 
       console.log(args.get_message()); 
      }); 
     } 

ответ

0

Когда объект клиента модель возвращает коллекцию объектов для вас, если каждый из этих объектов имеет свои собственные вложенные коллекции, они не будут инициализированы, если явно не попросите, чтобы они были загружены.

Как и в ответе here, вы должны иметь возможность обновить свой запрос до context.load() с дополнительным параметром, сообщающим, что загрузить.

Я считаю, что-то вроде кода ниже будет работать, но я не проверял:

context.load(terms,"Include(Name,Terms,Terms.Include(Name))"); 
+0

Спасибо за это, но где я могу получить список объектов/параметров для загрузки? – Aventus

+0

@ Aventus 'terms' представляет собой набор объектов Microsoft.SharePoint.Taxonomy.Term, поэтому вы можете найти его список свойств-членов здесь: https://msdn.microsoft.com/EN-US/library/office/microsoft. sharepoint.taxonomy.term_members.aspx – Thriggle

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