SharePointin siirtymisasetukset

Tässä artikkelissa kuvataan siirtymisasetussivustot, joissa SharePointin julkaiseminen on käytössä SharePointissa. Siirtymisen valinta ja määritys vaikuttavat merkittävästi SharePoint-sivustojen suorituskykyyn ja skaalautuvuuteen. SharePoint-julkaisusivustomallia tulee käyttää vain tarvittaessa keskitetyssä portaalissa, ja julkaisuominaisuus tulee ottaa käyttöön vain tietyissä sivustoissa, ja vain tarvittaessa, koska se voi vaikuttaa suorituskykyyn, jos sitä käytetään virheellisesti.

Huomautus

Jos käytät nykyaikaisia SharePoint-siirtymisvaihtoehtoja, kuten megavalikkoa, johdannaissiirtymistä tai keskittimen siirtymistä, tämä artikkeli ei koske sivustoasi. Nykyaikaiset SharePoint-sivustoarkkitehtuurit hyödyntävät entistä tasoitetumpaa sivustohierarkiaa ja keskittimen ja puhutun mallin. Näin voidaan toteuttaa monia tilanteita, jotka eivät edellytä SharePoint-julkaisuominaisuuden käyttöä.

Siirtymisasetusten yleiskatsaus

Siirtymispalvelun määritykset voivat vaikuttaa merkittävästi koko sivuston suorituskykyyn, ja on harkittava tarkkaan, miten valitset siirtymispalvelun ja määritykset, jotka skaalautuvat tehokkaasti SharePoint-sivuston vaatimusten mukaisesti. Valmiita siirtymispalveluita on kaksi sekä mukautettuja siirtymistoteutuksia.

Ensimmäinen vaihtoehto, Rakenteellinen siirtyminen, on suositeltu siirtymisvaihtoehto SharePointissa perinteisissä SharePoint-sivustoissa, jos otat rakenteellisen siirtymisen välimuistiin tallentamisen käyttöön sivustossasi. Tämä siirtymispalvelu näyttää nykyisen sivuston alapuolella olevat siirtymiskohteet ja valinnaisesti nykyisen sivuston ja sen rinnakkaiskohteet. Se tarjoaa lisäominaisuuksia, kuten suojauskatkaisun ja sivustorakenteen luetteloinnin. Jos välimuistiin tallentaminen on poistettu käytöstä, tämä vaikuttaa haitallisesti suorituskykyyn ja skaalautuvuuteen ja saattaa olla rajoituksen alainen.

Toinen hallittujen metatietojen siirtymistoiminto edustaa siirtymiskohteita hallittujen metatietojen termijoukon avulla. Suosittelemme, että suojauskatkaisu poistetaan käytöstä, ellei se ole välttämätöntä. Suojauskatkaisu on käytössä suojauksen oletusarvoisena asetuksena tälle siirtymispalvelulle. Monet sivustot eivät kuitenkaan edellytä suojauskatkaisun yleiskustannuksia, koska siirtymiselementit ovat usein yhdenmukaisia kaikille sivuston käyttäjille. Tämä siirtymispalvelu ei edellytä sivuston rakenteen luetteloinnia suositelluilla määrityksillä, joiden avulla suojauskatkaisu voidaan poistaa käytöstä, ja se on erittäin skaalattava ja sillä on hyväksyttävä suorituskykyvaikutus.

Valmiiden siirtymispalveluiden lisäksi monet asiakkaat ovat toteuttaneet onnistuneesti vaihtoehtoisia mukautettuja siirtymistoteutuksia. Katso Haku perustuva asiakaspuolen komentosarjat tässä artikkelissa.

SharePoint-siirtymisasetusten ammattilaiset ja huonot toiminnot

Seuraavassa taulukossa on yhteenveto kunkin vaihtoehdon ammattilaisista ja huonoista toiminnoista.

Rakenteellinen siirtyminen Hallittu siirtyminen Haku siirtyminen Mukautettu siirtymispalvelu
Ammattilaiset:

Helppo ylläpitää
Suojaus rajattu
Päivittyy automaattisesti 24 tunnin kuluessa, kun sisältöä muutetaan
Ammattilaiset:

Helppo ylläpitää
Ammattilaiset:

Suojaus rajattu
Päivittyy automaattisesti, kun sivustoja lisätään
Nopea latausaika ja paikallisesti välimuistiin tallennettu siirtymisrakenne
Ammattilaiset:

Laajempi vaihtoehtovalikoima on käytettävissä
Nopea lataaminen, kun välimuistiin tallentamista käytetään oikein
Monet vaihtoehdot toimivat hyvin reagoivan sivun rakenteen kanssa
Huonot puolet:

Vaikuttaa suorituskykyyn, jos välimuistiin tallentaminen on poistettu käytöstä
Rajoitusten alainen
Huonot puolet:

Ei päivitetä automaattisesti vastaamaan sivuston rakennetta
Vaikuttaa suorituskykyyn, jos suojauksen rajaus on käytössä tai kun siirtymisrakenne on monimutkainen
Huonot puolet:

Sivustojen järjestäminen helposti ei ole helppoa
Edellyttää perustyylisivun mukauttamista (teknisiä taitoja tarvitaan)
Huonot puolet:

Mukautettu kehitys on pakollista
Tarvitaan ulkoista tietolähdettä/välimuistia, kuten Azurea

Sivustollesi sopivin vaihtoehto riippuu sivuston vaatimuksista ja teknisestä ominaisuudesta. Jos haluat helposti määritettävän siirtymispalvelun, joka päivittyy automaattisesti, kun sisältöä muutetaan, rakenteellinen siirtyminen välimuisti käytössä on hyvä vaihtoehto.

Huomautus

Kun käytetään samaa periaatetta kuin nykyaikaisilla SharePoint-sivustoilla yksinkertaistamalla sivuston yleistä rakennetta tasaisemmaksi, hierarkkiseksi rakenteeksi, suorituskyky paranee ja siirtyminen nykyaikaisiin SharePoint-sivustoihin helpottuu. Tämä tarkoittaa sitä, että sen sijaan, että käytössä olisi yksittäinen sivustokokoelma, jossa on satoja sivustoja (alisivustoja), parempi tapa on saada useita sivustokokoelmia, joissa on hyvin vähän alisivustoja (alisivustoja).

Siirtymisen suorituskyvyn analysointi SharePointissa

SharePointin sivudiagnostiikka -työkalu on Microsoft Edge- ja Chrome-selainten selainlaajennus, joka analysoi sekä SharePointin modernia portaalia että perinteisiä julkaisusivustosivuja. Tämä työkalu toimii vain SharePointissa, eikä sitä voi käyttää SharePoint-järjestelmäsivulla.

Työkalu luo kullekin analysoidulle sivulle raportin, joka näyttää, miten sivu suoriutuu ennalta määritetyn sääntöjoukon mukaisesti, ja näyttää yksityiskohtaiset tiedot, kun testin tulokset jäävät perusaikataulun arvon ulkopuolelle. SharePoint-järjestelmänvalvojat ja suunnittelijat voivat työkalun avulla tehdä suorituskykyongelmien vianmäärityksen varmistaakseen, että uudet sivut optimoidaan ennen julkaisemista.

Erityisesti SPRequestDuration on aika, joka SharePointilla kestää sivun käsittelemiseen. Raskas siirtyminen (kuten sivujen sisällyttäminen siirtymistoimintoihin), monimutkaiset sivustohierarkiat sekä muut määritys- ja topologiavaihtoehdot voivat kaikki vaikuttaa huomattavasti pidempiin kestoihin.

Rakenteellisen siirtymisen käyttäminen SharePointissa

Tämä on oletuksena käytössä oleva valmiissa siirtymistoiminnossa, ja se on yksinkertaisin ratkaisu. Se ei edellytä mukautusta, ja myös ei-tekninen käyttäjä voi helposti lisätä kohteita, piilottaa kohteita ja hallita siirtymistoimintoja asetussivulla. Suosittelemme välimuistitallennuksen käyttöönottoa, jos suorituskyky kannattaa vaihtaa.

Rakenteellisen siirtymisen välimuistitallennuksen käyttöönotto

Sivuston asetukset>-kohdan Ulkoasussa>siirtyminen -kohdassa voit tarkistaa, onko rakenteellinen siirtyminen valittuna joko yleistä siirtymistä tai nykyistä siirtymistä varten. Näytä sivut -vaihtoehdon valitseminen vaikuttaa suorituskykyyn kielteisesti.

Rakenteellinen siirtyminen, näytä alisivustot valittuna.

Välimuistiin tallentaminen voidaan ottaa käyttöön tai poistaa käytöstä sivustokokoelman tasolla ja sivustotasolla, ja se on oletusarvoisesti käytössä molemmissa. Voit ottaa toiminnon käyttöön sivustokokoelman tasolla valitsemallaSivustoasetukset-sivustokokoelman>hallintasivustokokoelman> siirtymisruudun Ota välimuisti käyttöön -ruudun.

Ota välimuistiin tallentaminen käyttöön sivustokokoelman tasolla.

Jos haluat ottaa toiminnon käyttöön sivustotasolla, valitse Sivuston asetukset>Siirtyminen -kohdassa Ota välimuisti käyttöön -valintaruutu.

Ota välimuistiin tallentaminen käyttöön sivustotasolla.

Hallitun siirtymisen ja metatietojen käyttäminen SharePointissa

Hallittu siirtyminen on toinen valikkovaihtoehto, jonka avulla voit luoda uudelleen suurimman osan samoista toiminnoista kuin rakenteellinen siirtyminen. Hallitut metatiedot voidaan määrittää niin, että suojauksen rajaus on käytössä tai poistettu käytöstä. Kun suojausrajaus on poistettu käytöstä, hallittu siirtyminen on melko tehokasta, sillä se lataa kaikki siirtymislinkit vakiomäärällä palvelinkutsuja. Suojauksen rajaamisen ottaminen käyttöön aiheuttaa kuitenkin joitakin hallitun siirtymisen suorituskykyetuja.

Jos sinun on otettava suojauskatkaisu käyttöön, suosittelemme, että:

  • Päivitä kaikki käyttäjäystävälliset URL-linkit yksinkertaisiin linkkeihin
  • Lisää pakolliset suojauskatkaisusolmut käyttäjäystävällisiksi URL-osoitteiksi
  • Rajoita siirtymiskohteiden määrä enintään sataan ja enintään kolmeen tasoon

Monet sivustot eivät edellytä suojauskatkaisua, koska siirtymisrakenne on usein yhdenmukainen kaikille sivuston käyttäjille. Jos suojauskatkaisu on poistettu käytöstä ja siirtymistoimintoon lisätään linkki, johon kaikilla käyttäjillä ei ole käyttöoikeutta, linkki näkyy kuitenkin, mutta se johtaa käytön estämään viestiin. Sisällön tahattoman käytön vaaraa ei ole.

Hallitun siirtymisen ja tulosten käyttöönotto

Microsoft Learnissa on useita artikkeleita hallitun siirtymisen yksityiskohdista. Katso esimerkiksi SharePoint Serverin hallitun siirtymisen yleiskatsaus.

Hallitun siirtymisen toteuttamiseksi voit määrittää termejä, joiden URL-osoitteet vastaavat sivuston siirtymisrakennetta. Hallittu siirtyminen voidaan jopa manuaalisesti kuratoitu korvaamaan rakenteellinen siirtyminen monissa tapauksissa. Esimerkki:

SharePoint-sivuston rakenne.)

Haku perustuvien asiakaspuolen komentosarjojen käyttäminen

Yksi yleinen mukautettujen siirtymistoteutusten luokka käsittää asiakkaan hahmontamia suunnittelumalleja, jotka tallentavat paikallisen siirtymissolmujen välimuistin.

Näillä siirtymispalveluntarjoajilla on muutama tärkeä etu:

  • Ne toimivat yleensä hyvin reagoivan sivumallin kanssa.
  • Ne ovat erittäin skaalattavia ja suorituskykyviä, koska ne voidaan hahmontaa ilman resurssikustannuksia (ja päivittyä taustalla aikakatkaisun jälkeen).
  • Nämä siirtymispalvelut voivat noutaa siirtymistietoja erilaisten strategioiden avulla yksinkertaisista staattisista määrityksistä erilaisiin dynaamisiin tietopalveluihin.

Tietopalvelu voi esimerkiksi käyttää Haku pohjaista siirtymistä, mikä mahdollistaa joustavuuden siirtymissolmujen luetteloinnissa ja suojauksen suodatuksen tehokkaassa käsittelyssä.

Mukautettujen siirtymispalveluiden luomiseen on muitakin suosittuja vaihtoehtoja. Katso lisätietoja mukautetun siirtymispalvelun luomisesta artikkelista SharePoint-portaalien siirtymisratkaisut .

Haun avulla voit hyödyntää taustalla luotuja indeksejä jatkuvalla indeksoinnilla. Hakutulokset noudetaan hakuindeksistä ja tulokset rajataan suojatusti. Tämä on yleensä nopeampi kuin käyttövalmiit siirtymispalvelut, kun suojauskatkaisua tarvitaan. Kun etsit rakenteellista siirtymistoimintoa, erityisesti jos sivustorakenne on monimutkainen, sivun latausaika nopeutuu huomattavasti. Tärkein etu hallittuun siirtymistoimintoon verrattuna on se, että hyödyt suojauskatkaisusta.

Tähän menetelmään kuuluu mukautetun perustyylisivun luominen ja valmista siirtymiskoodin korvaaminen mukautetulla HTML:lla. Korvaa tiedoston seattle.htmlsiirtymiskoodi noudattamalla seuraavassa esimerkissä kuvattua toimintosarjaa. Tässä esimerkissä seattle.html avaat tiedoston ja korvaat koko elementin id="DeltaTopNavigation" mukautetulla HTML-koodilla.

Esimerkki: Korvaa perustyylisivun valmista siirtymiskoodi

  1. Siirry Sivuston asetukset -sivulle.
  2. Avaa perustyylisivujen valikoima valitsemalla Perustyylisivut.
  3. Täältä voit siirtyä kirjastossa ja ladata tiedoston seattle.master.
  4. Muokkaa koodia tekstieditorilla ja poista koodilohko seuraavassa näyttökuvassa.
    Poista näytetty koodilohko.
  5. Poista koodi - ja <\SharePoint:AjaxDelta> -tunnisteiden välistä <SharePoint:AjaxDelta id="DeltaTopNavigation"> ja korvaa se seuraavalla katkelmalla:
<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 level1">
                <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 }">

                 <!-- ko if: children.length > 0-->
                    <span aria-haspopup="true" class="additional-background ms-navedit-flyoutArrow dynamic-children">
                        <span class="menu-item-text" data-bind="text: item.Title">
                        </span>
                    </span>
                <!-- /ko -->
                <!-- ko if: children.length == 0-->
                    <span aria-haspopup="true" class="ms-navedit-flyoutArrow dynamic-children">
                        <span class="menu-item-text" data-bind="text: item.Title">
                        </span>
                    </span>
                <!-- /ko -->
                </a>

                <!-- ko if: children.length > 0-->
                <ul id="menu"  data-bind="foreach: children;" class="dynamic  level2" >
                    <li class="dynamic level2">
                        <a class="dynamic menu-item ms-core-listMenu-item ms-displayInline  ms-navedit-linkNode" data-bind="attr: { href: item.Url, title: item.Title }">

          <!-- ko if: children.length > 0-->
          <span aria-haspopup="true" class="additional-background ms-navedit-flyoutArrow dynamic-children">
           <span class="menu-item-text" data-bind="text: item.Title">
           </span>
          </span>
           <!-- /ko -->
          <!-- ko if: children.length == 0-->
          <span aria-haspopup="true" class="ms-navedit-flyoutArrow dynamic-children">
           <span class="menu-item-text" data-bind="text: item.Title">
           </span>
          </span>
          <!-- /ko -->
                        </a>
          <!-- ko if: children.length > 0-->
         <ul id="menu" data-bind="foreach: children;" class="dynamic level3" >
          <li class="dynamic level3">
           <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>
           <!-- /ko -->
                    </li>
                </ul>
                <!-- /ko -->
            </li>
        </ul>
    </div>
</div>

6. Korvaa latauskuvan ankkuritunnisteen alussa oleva URL-osoite linkillä sivustokokoelman latauskuvaan. Kun olet tehnyt muutokset, nimeä tiedosto uudelleen ja lataa se sitten perustyylisivujen valikoimaan. Tämä luo uuden .master-tiedoston.
7. Tämä HTML on perusmerkintä, joka täytetään JavaScript-koodista palautetuilla hakutuloksilla. Sinun on muokattava koodia, jotta voit muuttaa var root = "sivustokokoelman URL-osoite" -arvoa seuraavassa katkelmassa osoitetulla tavalla:
var root = "https://spperformance.sharepoint.com/sites/NavigationBySearch";

8. Tulokset määritetään self.nodes-matriisiin ja hierarkia luodaan objekteista käyttämällä linq.js määrittämällä tulos matriisin self.hierarchy-arvoksi. Tämä matriisi on objekti, joka on sidottu HTML-koodiin. Tämä tehdään toggleView()-funktiossa välittämällä itseobjekti ko.applyBinding()-funktioon.
Tällöin hierarkiamatriisi sidotaan seuraavaan HTML-koodiin:
<div data-bind="foreach: hierarchy" class="noindex ms-core-listMenu-horizontalBox">

Tapahtumakäsittelijät kohteelle mouseenter ja mouseexit lisätään ylimmän tason siirtymisruutuun, jotta voit käsitellä -funktiossa addEventsToElements() tehtäviä alisivuston avattavia valikoita.

Monimutkaisessa siirtymisesimerkkimme tuoreessa sivun kuormituksessa ilman paikallista välimuistia näkyy, että palvelimessa käytetty aika on vähennetty rakenteellisesta vertailusiirtymisestä, jotta se saisi samanlaisen tuloksen kuin hallittu siirtymismenetelmä.

Tietoja JavaScript-tiedostosta...

Huomautus

Jos käytät mukautettua JavaScriptiä, varmista, että julkinen CDN on käytössä ja että tiedosto on CDN-sijainnissa.

Koko JavaScript-tiedosto on seuraava:

//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 firefox
    // 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.level1").mouseover(function () {
          var position = $(this).position();
          $(this).find("ul.level2").css({ width: 100, left: position.left + 10, top: 50 });
      })
   .mouseout(function () {
     $(this).find("ul.level2").css({  left: -99999, top: 0 });
   
    });
   
     $("li.level2").mouseover(function () {
          var position = $(this).position();
          console.log(JSON.stringify(position));
          $(this).find("ul.level3").css({ width: 100, left: position.left + 95, top:  position.top});
      })
   .mouseout(function () {
     $(this).find("ul.level3").css({  left: -99999, top: 0 });
    });
} _spBodyOnLoadFunctionNames.push("InitCustomNav");

Jos haluat tehdä yhteenvedon yllä näkyvästä koodista jQuery $(document).ready funktiossa, on viewModel object luotu, ja sitten kutsutaan kyseisen objektin loadNavigationNodes() funktiota. Tämä funktio joko lataa aiemmin luodun siirtymishierarkian, joka on tallennettu asiakasselaimen paikalliseen HTML5-tallennustilaan, tai se kutsuu funktiota queryRemoteInterface().

QueryRemoteInterface() luo pyynnön käyttämällä getRequest() -funktiota komentosarjassa aiemmin määritetyllä kyselyparametrilla ja palauttaa sitten tietoja palvelimesta. Nämä tiedot ovat käytännössä kaikkien sivustokokoelman sivustojen matriisi, joka esitetään tiedonsiirto-objekteina, joilla on eri ominaisuuksia.

Nämä tiedot jäsennevät sitten aiemmin määritettyihin SPO.Models.NavigationNode objekteihin, joiden avulla Knockout.js luodaan havaittavia ominaisuuksia käytettäväksi sitomalla arvot aiemmin määritettyyn HTML-koodiin.

Objektit sijoitetaan sitten tulosmatriisiin. Tämä matriisi jäsentää JSON:iin käyttämällä Tyrmäys-toimintoa ja tallennetaan paikalliseen selaintallennustilaan, mikä parantaa suorituskykyä tulevissa sivukuormituksissa.

Tämän lähestymistavan edut

Eräs tämän lähestymistavan tärkeä etu on se, että käyttämällä HTML5:n paikallista tallennustilaa siirtymistoiminto tallennetaan paikallisesti käyttäjälle, kun hän seuraavan kerran lataa sivun. Olemme saaneet merkittäviä suorituskyvyn parannuksia käyttämällä haun ohjelmointirajapintaa rakenteellista siirtymistä varten. Tämän toiminnon suorittaminen ja mukauttaminen vaatii kuitenkin teknisiä ominaisuuksia.

Esimerkissä sivustot järjestetään samalla tavalla kuin valmiissa rakenteellisessa siirtymisessä. aakkosjärjestykseen. Jos haluaisitte poiketa tästä järjestyksestä, sen kehittäminen ja ylläpitäminen olisi monimutkaisempaa. Lisäksi tämä lähestymistapa edellyttää poikkeamista tuetuista perustyylisivuista. Jos mukautettua perustyylisivua ei ylläpidetä, sivusto jää paitsi päivityksistä ja parannuksista, joita Microsoft tekee perustyylisivuihin.

Yllä olevalla koodilla on seuraavat riippuvuudet:

LinqJS:n nykyinen versio ei sisällä yllä olevassa koodissa käytettyä ByHierarchy-menetelmää, ja se rikkoo siirtymiskoodin. Voit korjata tämän lisäämällä seuraavan menetelmän Linq.js-tiedostoon ennen riviä Flatten: function ().

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);
         })
     });
 },

SharePoint Serverin hallitun siirtymisen yleiskatsaus

Rakenteellinen siirtymisen välimuistitallennus ja suorituskyky