错误:集合还没有初始化

ERROR: The collection has not been initialized

本文关键字:初始化 还没有 集合 错误      更新时间:2023-09-26

我正在使用下面的代码查询托管元数据的内容。我遇到一个错误

集合尚未初始化

当我在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());
            });
        }

当客户端对象模型为您返回一个对象集合时,如果每个对象都有自己的子集合,它们将不会被初始化,除非您显式地要求加载它们。

与这里提供的答案类似,您应该能够使用一个额外的参数来更新对context.load()的调用,告诉它要加载什么。

我相信下面的代码可以工作,但我还没有测试过:

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