SharePoint Onlinen siirtymisasetukset

Tärkeää: Tämä on artikkeli on käännetty koneellisesti. Lue vastuuvapauslauseke. Tämän artikkelin englanninkielinen versio on täällä .

Tässä artikkelissa kerrotaan, miten voit parantaa SharePoint Online -sivujen latausaikoja rakenteellisten siirtymistoimintojen ja hakuperusteisten siirtymistoimintojen avulla.

Yleiset siirtymistoiminnot ja kyselyt, joita vaaditaan rakenteellisten siirtymistoimintojen luomiseen, voivat hidastaa sivujesi latautumista SharePoint Onlinessa. Tämä johtuu siitä, että jokainen näistä kyselyistä lähettää uuden pyynnön SQL-palvelimeen. Mitä enemmän sivustoja ja alisivustoja sinulla on, sitä enemmän pyyntöjä SQL-palvelimeen lähetetään. Tämä ongelma koskee myös perustyylisivuja. Tämä tarkoittaa sitä, että ongelma vaikuttaa myös yleisiin siirtymistoimintoihin.

Jotkin SharePoint-sivustot vaativat suuria ja monimutkaisia rakenteita. Jos käytät käyttövalmiita siirtymistoimintoja, jotka käyttävät sisältöä kyselyiden avulla, sivut saattavat latautua hitaasti useista sivutasoista johtuen. Jokainen alisivustojen taso luo uuden kyselyn.

SharePointissa on kaksi käyttövalmista siirtymistapaa sekä kolmas mukautettu ja hakuun perustuva siirtymistapa. Jokaisella tavalla on omat hyvät ja huonot puolensa, jotka on esitelty alla olevassa taulukossa.

Rakenteellinen siirtyminen

Hallittu siirtyminen

Hakupohjainen siirtyminen

Hyvät puolet:

  • Tämä on helppo määrittää.

  • Suojaus huomioidaan.

  • Päivittyy automaattisesti, kun sivustoja lisätään.

Hyvät puolet:

  • Ylläpito on helppoa.

Hyvät puolet:

  • Suojaus huomioidaan.

  • Päivittyy automaattisesti, kun sivustoja lisätään.

  • Latausajat ovat nopeita ja siirtymisrakenne tallennetaan paikallisesti välimuistiin.

Huonot puolet:

  • Toimii huonosti, jos sivustorakenne on monimutkainen.

Huonot puolet:

  • Ei päivity automaattisesti sivustorakenteen mukaisesti.

Huonot puolet:

  • Sivustoja ei voi järjestää helposti.

  • Vaatii perustyylisivun muokkaamista, mihin vaaditaan teknistä osaamista.

Jos sinulla on paljon alisivustoja sisältävä sivusto ja käytät rakenteellista siirtymistä, tämä saattaa hidastaa sivujen latautumista merkittävästi. Sivustollesi parhaiten soveltuva tapa riippuu sivustosi vaatimuksista ja omasta teknisestä osaamisestasi. Jos osaat käyttää ja mukauttaa perustyylisivua sekä osaat ylläpitää muutoksia SharePoint Onlinen oletusperustyylisivussa, hakuperusteiset siirtymistoiminnot takaavat sivujen parhaan toiminnon käyttäjille. Jos haluat hyvän kompromissin heti käyttövalmiiden oletussiirtymistoimintojen ja hakuperusteisten toimintojen välille, hallitut siirtymistoiminnot ovat erittäin hyvä vaihtoehto. Voit ylläpitää hallittuja siirtymistoimintoja määritysten avulla: tämä ei vaadi koodin mukautustiedostoja. Nämä siirtymistoiminnot ovat merkittävästi nopeampia kuin heti käyttövalmiit rakenteelliset siirtymistoiminnot.

Voit myös järjestää nykyisen sivustosi uudelleen ja vähentää vaadittujen siirtymiskohteiden ja alisivustojen määrää. Rakenteelliset siirtymistoiminnot toimivat nimittäin hyvin, kunhan sivuston rakenne ja siirtymistoiminnot eivät ole liian monimutkaisia.

Tämä artikkeli vertaa eri lähestymistapoja esimerkkisivustokokoelmassa. Esimerkkisivustokokoelmassa on 11 alisivustoa, joista kullakin on neljä omaa alisivustoa.

Näyttökuva sivustoista ja alisivustoista

Rakenteellisten siirtymistoimintojen käyttö SharePoint Onlinessa

Rakenteelliset siirtymistoiminnot ovat heti käyttövalmiita oletussiirtymistoimintoja. Useimmissa tapauksissa ne ovat helpoin ja sopivin tapa. Rakenteellinen siirtyminen toimii hyvin, kunhan sivustorakenne ei ole monimutkainen ja sisällä useita alisivustoja tai alisivustotasoja. Tämän tavan tärkeimpiä etuja ovat suojauksen huomiointi, automaattinen päivitys uusia sivustoja lisättäessä ja se, että tämä tapa ei edellytä perustyylisivun muokkaamista. Myös käyttäjät, joilla ei ole vankkaa teknistä osaamista, voit lisätä ja piilottaa kohteita sekä hallita siirtymistä asetussivulla.

Rakenteellisten siirtymistoimintojen käyttöönotto SharePoint Onlinessa

Tämä esimerkki osoittaa, miten SharePoint Online -perusratkaisu toimii rakenteellisilla siirtymistoiminnoilla, kun Näytä alisivustot -asetus on käytössä. Alla on näyttökuva asetuksista, joihin pääset valitsemalla Sivuston asetukset > Siirtyminen.

Näyttökuva alisivustoista

Rakenteellisten siirtymistoimintojen tehokkuuden analysointi SharePoint Onlinessa

Jos haluat analysoida SharePoint-sivun tehokkuutta, käytä Internet Explorerin F12-sovelluskehittäjätyökalujen Verkko-välilehteä.

Näyttökuva: F12-sovelluskehittäjätyökalut, Verkko-välilehti

Napsauta Verkko-välilehdellä ladattavaa .aspx-sivua ja siirry sitten Otsikot-välilehteen.

Näyttökuva tietovälilehdestä

Valitse Vastausotsikot.

Näyttökuva Tiedot-välilehdestä

SharePoint palauttaa hyödyllisiä diagnostiikkatietoja vastausotsikoissaan. Eräs hyödyllisimmistä on SPRequestDuration   : se ilmoittaa millisekunteina, kuinka kauan pyynnön käsittely palvelimessa kesti.

Seuraavassa näyttökuvassa Näytä alisivustot -asetusta ei ole valittuna rakenteellisessa siirtymisessä. Tämä tarkoittaa sitä, että yleisessä siirtymisessä on vain sivustokokoelman linkki:

Näyttökuva, jossa latausajat näkyvät pyynnön kestona

SPRequestDuration   -avaimen arvo on 245 millisekuntia. Tämä tarkoittaa sitä, kuinka kauan pyynnön käsittely kesti. Koska sivustossa on vain yksi siirtymiskohde, tämä on hyvä vertailuarvo sille, kuinka SharePoint Online suoriutuu ilman raskaita siirtymistoimintoja. Seuraavasta näyttökuvasta näet, miten alisivustojen lisääminen vaikuttaa tähän avaimeen.

Näyttökuva, jossa pyynnön kesto on 2502 ms

Alisivustojen lisääminen pidensi merkittävästi aikaa, joka sivupyynnön palauttamiseen kuluu.

Tavallisen rakenteellisen siirtymisen käytöllä on se etu, että voit helposti määrittää järjestyksen, piilottaa sivustoja ja lisätä sivustoja, suojaus huomioidaan ja se että et poikkea SharePoint Onlinessa käytetyistä tuetuista perustyylisivuista. Jos jäsennät sivustosi huolellisesti ja käytät sivustokokoelmassa mahdollisimman vähän alisivustoja, rakenteellinen siirtyminen toimii hyvin.

Hallitun siirtymisen ja hallittujen metatietojen käyttö SharePoint Onlinessa

Hallittu siirtyminen on toinen heti käyttövalmis oletussiirtymistapa, jolla voit luoda samanlaisia toimintoja kuin rakenteellisella siirtymisellä.

Hallittujen metatietojen käytöllä on se etu, että tiedot voidaan tällä tavoin hakea paljon nopeammin kuin silloin, jos sivuston siirtymistoiminnot luodaan hakemalla sisältö kyselyillä. Vaikka tämä on paljon nopeampaa, tulosten suojausta ei voida tarkistaa. Jos käyttäjällä ei siis ole käyttöoikeutta tiettyyn sivustoon, linkki näytetään, mutta se johtaa virheilmoitukseen.

Hallitun siirtymisen käyttöönotto ja tulokset   

TechNet-palvelusta löytyy useita artikkeleita hallittuun siirtymiseen liittyen. Suosittelemme esimerkiksi ohjeartikkelia SharePoint Server 2013:n hallitun siirtymisen yleiskatsaus.

Jos haluat käyttää hallittua siirtymistä, tarvitset termisäilön järjestelmänvalvojan oikeudet. Kun määrität termeihin URL-osoitteet, jotka vastaavat sivustokokoelman rakennetta, hallitulla siirtymisellä voidaan korvata rakenteellinen siirtyminen Esimerkki:

Näyttökuva Alisivusto1-esimerkistä

Seuraavassa esimerkissä näet monimutkaisen siirtymisen tehokkuuden, kun käytössä on hallittu siirtyminen.

Näyttökuva SPRequestDuration-esimerkistä

Hallitun siirtymisen johdonmukainen käyttö parantaa suorituskykyä verrattuna rakenteelliseen siirtymiseen, jossa sisältö haetaan kyselyillä.

Hakupohjaisten asiakaspuolen komentosarjojen käyttö

Haun avulla voit hyödyntää indeksejä, jotka muodostetaan taustalla jatkuvan indeksoinnin yhteydessä. Tämän ansiosta vältät raskaat sisältökyselyt. Hakutulokset haetaan hakuindeksistä. Lisäksi tulosten suojaus tarkistetaan. Tämä tapa on nopeampi kuin tavalliset sisältökyselyt. Haun käyttäminen rakenteellisessa siirtymisessä nopeuttaa siirtymistä merkittävästi, etenkin sivuston rakenteen ollessa monimutkainen. Tämän suurin etu hallittuun siirtymiseen verrattuna on se, että suojaus tarkistetaan.

Tämä lähestymistapa edellyttää mukautetun perustyylisivun luomista ja heti käyttövalmiin siirtymiskoodin korvaamista mukautetulla HTML-koodilla. Näiden ohjeiden avulla voit korvata siirtymiskoodin tiedostossa seattle.html.

Tässä esimerkissä avaat seattle.html-tiedoston ja korvaat koko elementin id=”DeltaTopNavigation” mukautetulla HTML-koodilla.

Esimerkki: perustyylisivun käyttövalmiin siirtymiskoodin korvaaminen

  1. Siirry Sivuston asetukset -sivulle.

  2. Avaa perustyylisivujen valikoima valitsemalla Perustyylisivut.

  3. Siellä voit siirtyä läpi kirjaston ja ladata tiedoston seattle.master.

  4. Muokkaa koodia tekstieditorilla ja poista seuraavan näyttökuvan koodilohko.

    Näyttökuva poistettavasta DeltaTopNavigation-koodista
  5. Poista koodi tunnisteiden <SharePoint:AjaxDelta id=”DeltaTopNavigation”> ja <\SharePoint:AjaxDelta> väliltä ja korvaa se seuraavalla koodilla:

    <div id="loading">
      <!--Replace with path to loading image.-->
      <div style="background-image: url(''); height: 22px; width: 22px; ">
      </div>
    </div>
    <!-- Main Content-->
    <div id="navContainer" style="display:none">
        <div data-bind="foreach: hierarchy" class="noindex ms-core-listMenu-horizontalBox">
            <a class="dynamic menu-item ms-core-listMenu-item ms-displayInline ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">
                <span class="menu-item-text" data-bind="text: item.Title">
                </span>
            </a>
            <ul id="menu" data-bind="foreach: $data.children" style="padding-left:20px">
                <li class="static dynamic-children">
                    <a class="static dynamic-children menu-item ms-core-listMenu-item ms-displayInline ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">
                        <span aria-haspopup="true" class="additional-background ms-navedit-flyoutArrow dynamic-children">
                            <span class="menu-item-text" data-bind="text: item.Title">
                            </span>
                        </span>
                    </a>
                    <ul id="menu" data-bind="foreach: children; visible: children.length>0" class="dynamic" >
                        <li class="dynamic">
                            <a class="dynamic menu-item ms-core-listMenu-item ms-displayInline ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">
                                <span class="menu-item-text" data-bind="text: item.Title">
                                </span>
                            </a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
  6. Korvaa lataaminen URL-osoite kuvan ankkuritunnisteen alussa sivustokokoelman ladataan kuvan linkki. Kun olet tehnyt haluamasi muutokset, nimeä tiedosto ja lataa se sitten perustyylisivujen valikoimaan. Luo uusi .master-tiedosto.

  7. Tämä HTML on peruskoodia, johon lisätään JavaScript-koodista palautetut hakutulokset. Sinun täytyy muokata seuraavaa koodia siten, että vaihdat elementin var root = “site collection URL arvoa seuraavan koodiesimerkin osoittamalla tavalla:

    var root = “https://spperformance.sharepoint.com/sites/NavigationBySearch”;

    Koko JavaScript-tiedosto näyttää seuraavalta:

    //Models and Namespaces
    var SPOCustom = SPOCustom || {};
    SPOCustom.Models = SPOCustom.Models || {}
    SPOCustom.Models.NavigationNode = function () {
    
        this.Url = ko.observable("");
        this.Title = ko.observable("");
        this.Parent = ko.observable("");
    
    };
    
    var root = "https://spperformance.sharepoint.com/sites/NavigationBySearch";
    var baseUrl = root + "/_api/search/query?querytext=";
    var query = baseUrl + "'contentClass=\"STS_Web\"+path:" + root + "'&trimduplicates=false&rowlimit=300";
    
    var baseRequest = {
        url: "",
        type: ""
    };
    
    
    //Parses a local object from JSON search result.
    function getNavigationFromDto(dto) {
        var item = new SPOCustom.Models.NavigationNode();
        if (dto != undefined) {
    
            var webTemplate = getSearchResultsValue(dto.Cells.results, 'WebTemplate');
    
            if (webTemplate != "APP") {
                item.Title(getSearchResultsValue(dto.Cells.results, 'Title')); //Key = Title
                item.Url(getSearchResultsValue(dto.Cells.results, 'Path')); //Key = Path
                item.Parent(getSearchResultsValue(dto.Cells.results, 'ParentLink')); //Key = ParentLink
            }
    
        }
        return item;
    }
    
    function getSearchResultsValue(results, key) {
    
        for (i = 0; i < results.length; i++) {
            if (results[i].Key == key) {
                return results[i].Value;
            }
        }
        return null;
    }
    
    //Parse a local object from the serialized cache.
    function getNavigationFromCache(dto) {
        var item = new SPOCustom.Models.NavigationNode();
    
        if (dto != undefined) {
    
            item.Title(dto.Title);
            item.Url(dto.Url);
            item.Parent(dto.Parent);
        }
    
        return item;
    }
    
    /* create a new OData request for JSON response */
    function getRequest(endpoint) {
        var request = baseRequest;
        request.type = "GET";
        request.url = endpoint;
        request.headers = { ACCEPT: "application/json;odata=verbose" };
        return request;
    };
    
    /* Navigation Module*/
    function NavigationViewModel() {
        "use strict";
        var self = this;
        self.nodes = ko.observableArray([]);
        self.hierarchy = ko.observableArray([]);;
        self.loadNavigatioNodes = function () {
            //Check local storage for cached navigation datasource.
            var fromStorage = localStorage["nodesCache"];
            if (false) {
                var cachedNodes = JSON.parse(localStorage["nodesCache"]);
    
                if (cachedNodes && timeStamp) {
                    //Check for cache expiration. Currently set to 3 hrs.
                    var now = new Date();
                    var diff = now.getTime() - timeStamp;
                    if (Math.round(diff / (1000 * 60 * 60)) < 3) {
    
                        //return from cache.
                        var cacheResults = [];
                        $.each(cachedNodes, function (i, item) {
                            var nodeitem = getNavigationFromCache(item, true);
                            cacheResults.push(nodeitem);
                        });
    
                        self.buildHierarchy(cacheResults);
                        self.toggleView();
                        addEventsToElements();
                        return;
                    }
                }
            }
            //No cache hit, REST call required.
            self.queryRemoteInterface();
        };
    
        //Executes a REST call and builds the navigation hierarchy.
        self.queryRemoteInterface = function () {
            var oDataRequest = getRequest(query);
            $.ajax(oDataRequest).done(function (data) {
                var results = [];
                $.each(data.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results, function (i, item) {
    
                    if (i == 0) {
                        //Add root element.
                        var rootItem = new SPOCustom.Models.NavigationNode();
                        rootItem.Title("Root");
                        rootItem.Url(root);
                        rootItem.Parent(null);
                        results.push(rootItem);
                    }
                    var navItem = getNavigationFromDto(item);
                    results.push(navItem);
                });
                //Add to local cache
                localStorage["nodesCache"] = ko.toJSON(results);
    
                localStorage["nodesCachedAt"] = new Date().getTime();
                self.nodes(results);
                if (self.nodes().length > 0) {
                    var unsortedArray = self.nodes();
                    var sortedArray = unsortedArray.sort(self.sortObjectsInArray);
    
                    self.buildHierarchy(sortedArray);
                    self.toggleView();
                    addEventsToElements();
                }
            }).fail(function () {
                //Handle error here!!
                $("#loading").hide();
                $("#error").show();
            });
        };
        self.toggleView = function () {
            var navContainer = document.getElementById("navContainer");
            ko.applyBindings(self, navContainer);
            $("#loading").hide();
            $("#navContainer").show();
    
        };
        //Uses linq.js to build the navigation tree.
        self.buildHierarchy = function (enumerable) {
            self.hierarchy(Enumerable.From(enumerable).ByHierarchy(function (d) {
                return d.Parent() == null;
            }, function (parent, child) {
                if (parent.Url() == null || child.Parent() == null)
                    return false;
                return parent.Url().toUpperCase() == child.Parent().toUpperCase();
            }).ToArray());
    
            self.sortChildren(self.hierarchy()[0]);
        };
    
    
        self.sortChildren = function (parent) {
    
            // sjip processing if no children
            if (!parent || !parent.children || parent.children.length === 0) {
                return;
            }
    
            parent.children = parent.children.sort(self.sortObjectsInArray2);
    
            for (var i = 0; i < parent.children.length; i++) {
                var elem = parent.children[i];
    
                if (elem.children && elem.children.length > 0) {
                    self.sortChildren(elem);
                }
            }
        };
    
        // ByHierarchy method breaks the sorting in chrome and firefix 
        // we need to resort  as ascending
        self.sortObjectsInArray2 = function (a, b) {
            if (a.item.Title() > b.item.Title())
                return 1;
            if (a.item.Title() < b.item.Title())
                return -1;
            return 0;
        };
    
    
        self.sortObjectsInArray = function (a, b) {
            if (a.Title() > b.Title())
                return -1;
            if (a.Title() < b.Title())
                return 1;
            return 0;
        }
    }
    
    //Loads the navigation on load and binds the event handlers for mouse interaction.
    function InitCustomNav() {
        var viewModel = new NavigationViewModel();
        viewModel.loadNavigatioNodes();
    }
    
    function addEventsToElements() {
        //events.
        $("li.dynamic-children").mouseover(function () {
            var position = $(this).position();
            $(this).find("ul").css({ width: 125, left: position.left + 10, top: 50 });
    
        })
            .mouseout(function () {
                $(this).find("ul").css({ width: 0, left: -99999, top: 0 });
            });
    }
    
    _spBodyOnLoadFunctionNames.push("InitCustomNav");
    

    Tehdä yhteenvedon koodi on luotu viewModel -objekti ja sitten objektin loadNavigationNodes() toimi yllä jQuery $(document).ready -funktiossa kutsutaan. Tämän funktion joko Lataa aiemmin luodun siirtymishierarkiassa selaimeen HTML5: n paikallisen tallennustilaan tallennettuja tai kutsuu funktion queryRemoteInterface().

    QueryRemoteInterface() muodostaa getRequest() -funktion käyttäminen kyselyn parametri määritetty aiemmassa komentosarja pyyntö ja palauttaa sitten palvelimen tiedot. Nämä tiedot ovat olennaisesti esitetään tietojen siirto-objektit, joissa on erilaisia ominaisuuksia sivustokokoelman sivustojen matriisin. Nämä tiedot sitten jäsentää kyselyjä aiemmin määritettyä SPO.Models.NavigationNode objektit, jotka Knockout.js avulla voit luoda havaittavia ominaisuuksien käyttäminen tietojen sidonta arvot verkkosovelluksen HTML-, joka on määritetty aiemmin. Objektien sijoitetaan sitten tulokset-matriisi. Tämän taulukon kyselyjä käyttämällä syrjäytyksen JSON jäsentää ja tallennetaan paikallisesta selaimesta muistiin parannettu suorituskyky-tulevien sivujen latausaikaa sekunneilla.

  8. Seuraavaksi tulokset määritetyt self.nodes -matriisi ja hierarkian muodostanut objektien tulosteen määritteleminen matriisi- self.heirarchylinq.js ulos. Tämä matriisi on objekti, joka on sidottu HTML. Tämä tehdään toggleView() -funktiossa siirtämällä itse objektin ko.applyBinding() -funktiota. Tämä aiheuttaa sitten seuraavan HTML-koodin sitoa hierarkia-taulukko:

    <div data-bind=”foreach: hierarchy” class=”noindex ms-core-listMenu-horizontalBox”>

    Lopuksi mouseenter ja mouseexit tapahtuma-käsittelytoimintoja lisätään ylätasolla käsittelemään alisivuston avattavissa valikoissa mikä tehdään addEventsToElements() -funktiota.

    Siirtymisen tulokset näkyvät alla olevassa näyttökuvassa:

    Näyttökuva siirtymistuloksista

    Monimutkaisen siirtymisen esimerkissämme on uusi sivulataus ilman välimuistiin tallentamista. Tämä osoittaa, että palvelimessa kulunut aika on lyhyempi kuin rakenteellisen siirtymisen vertailuarvo (ja samankaltainen kuin hallitulla siirtymisellä).

    SPRequestDuration 301 -näyttökuva

    Tämän lähestymistavan tärkeimpiä etuja ovat se, että se käyttää paikallista HTML5-tallennusta ja että siirtyminen tallennetaan paikallisesti käyttäjälle seuraavaa sivulatausta varten.

Hakuohjelmointirajapinnan käyttö rakenteellisessa siirtymisessä parantaa suorituskykyä merkittävästi, mutta tämän toiminnon toteutus ja mukautus vaatii teknistä osaamista. Esimerkkitoteutuksessa sivustot järjestetään samalla tavalla kuin käyttövalmiissa oletussiirtymisessä (rakenteellinen siirtyminen) eli aakkosjärjestykseen. Jos haluat poiketa tästä järjestyksestä, toteutus ja ylläpito on monimutkaisempaa. Lisäksi tämä lähestymistapa vaatii, että poikkeat perustyylisivuista. Jos mukautettua perustyylisivua ei ylläpidetä, sivusto jää paitsi päivityksistä ja parannuksista, joita Microsoft tekee perustyylisivuihin.

Yllä koodi on seuraavat vaatimukset:

LinqJS nykyinen versio ei ole yllä koodissa ByHierarchy menetelmää ja vaihtuvat siirtyminen-koodi. Voit korjata ongelman Lisää seuraava menetelmä Linq.js-tiedostoa ennen rivin ”Flatten: toimi ()”.

ByHierarchy: function(firstLevel, connectBy, orderBy, ascending, parent) {
     ascending = ascending == undefined ? true : ascending;
     var orderMethod = ascending == true ? 'OrderBy' : 'OrderByDescending';
     var source = this;
     firstLevel = Utils.CreateLambda(firstLevel);
     connectBy = Utils.CreateLambda(connectBy);
     orderBy = Utils.CreateLambda(orderBy);
    
     //Initiate or increase level
     var level = parent === undefined ? 1 : parent.level + 1;

    return new Enumerable(function() {
         var enumerator;
         var index = 0;

        var createLevel = function() {
                 var obj = {
                     item: enumerator.Current(),
                     level : level
                 };
                 obj.children = Enumerable.From(source).ByHierarchy(firstLevel, connectBy, orderBy, ascending, obj);
                 if (orderBy !== undefined) {
                     obj.children = obj.children[orderMethod](function(d) {
                         return orderBy(d.item); //unwrap the actual item for sort to work
                     });
                 }
                 obj.children = obj.children.ToArray();
                 Enumerable.From(obj.children).ForEach(function(child) {
                     child.getParent = function() {
                         return obj;
                     };
                 });
                 return obj;
             };

        return new IEnumerator(

        function() {
             enumerator = source.GetEnumerator();
         }, function() {
             while (enumerator.MoveNext()) {
                 var returnArr;
                 if (!parent) {
                     if (firstLevel(enumerator.Current(), index++)) {
                         return this.Yield(createLevel());
                     }

                } else {
                     if (connectBy(parent.item, enumerator.Current(), index++)) {
                         return this.Yield(createLevel());
                     }
                 }
             }
             return false;
         }, function() {
             Utils.Dispose(enumerator);
         })
     });
 },

Huomautus: Konekäännöksestä ilmoittava vastuusvapauslauseke: Tämä artikkeli on käännetty tietokonejärjestelmällä, eikä kieliasiantuntija ole muokannut sitä. Microsoft tarjoaa nämä konekäännökset avuksi muille kuin englantia puhuville käyttäjille, jotta he saavat lisätietoja Microsoftin tuotteista, palveluista ja tekniikoista. Koska artikkeli on koneellisesti käännetty, se saattaa sisältää sanasto-, lauseoppi- ja kielioppivirheitä.

Kehitä taitojasi
Tutustu koulutusmateriaaliin
Saat uudet ominaisuudet ensimmäisten joukossa
Liity Office Insider -käyttäjiin

Oliko näistä tiedoista hyötyä?

Kiitos palautteesta!

Kiitos palautteestasi! Näyttää siltä, että Office-tukiedustajamme avusta voi olla sinulle hyötyä.

×