אפשרויות ניווט עבור SharePoint Online

חשוב: מאמר זה תורגם בתרגום מכונה, ראה כתב ויתור. תוכל למצוא את הגרסה באנגלית של המאמר כאן לעיונך.

מאמר זה מתאר כיצד שיפור זמני טעינת עמודים עבור SharePoint Online באמצעות בניווט מובנה וניווט מונחי-חיפוש.

ניווט כללי ושאילתות נדרש כדי לבנות בניווט מובנה ניתן להפוך דפי טעינת יותר לאט ב- SharePoint Online. הסיבה לכך היא כל אחת שאילתות אלה שולח בקשה נוספת ל- SQL server. לכל אתר או אתר משנה שברשותך, מתבצעות בקשות נוסף ל- SQL server. בעיה זו משפיעה גם על הדפים הראשיים. פירוש הדבר כי הניווט הכללי גם מושפעים.

אתרי SharePoint מסוימים דורשים גדולים ומבני מורכבים. שימוש בניווט מובנה של ה-המוכנים לשימוש, המשתמשת תוכן על-ידי שאילתה, העלול לגרום לזמני הטעינה של דף איטי עקב שכבות אתרים מרובים. כל אחד השכבות של אתרי משנה גם יוצרת שאילתה אחרת.

קיימות שתי אפשרויות ניווט הראשי של ה-המוכנים לשימוש ב- SharePoint, כמו גם שלישית, בגישה מותאם אישית, מונחי-חיפוש. כל אפשרות כוללת היתרונות והחסרונות כמתואר בטבלה הבאה.

בניווט מובנה

ניווט מנוהל

ניווט מונחי-חיפוש

מומחי:

  • קל קביעת תצורה

  • חיתוך-אבטחה

  • מעדכן באופן אוטומטי כאשר מתווספים אתרים

מומחי:

  • תחזוקה קלה

מומחי:

  • חיתוך-אבטחה

  • מעדכן באופן אוטומטי כאשר מתווספים אתרים

  • Fast טוען מבנה ניווט זמן והשמורות מקומית

מלים:

  • באפשרותך לבצע כראוי עם מבנה האתר מורכבים

מלים:

  • מתעדכן באופן אוטומטי כדי לשקף את מבנה האתר

מלים:

  • אין אפשרות לאתרים סדר בקלות

  • דורש ההתאמה האישית של הדף הראשי (טכנית הכישורים הנדרשים)

אם יש לך אתר עם כמות גדולה של אתרי משנה ואתה משתמש בניווט מובנה, ייתכן מאט שלך טעינת הדף באופן משמעותי. האפשרות המתאימה ביותר עבור האתר שלך תלויים לדרישותיך האתר שלך יכולת טכנית. אם אתה חש בנוח באמצעות דף ראשי מותאם אישית ויש לך יכולת מסוימת בארגון כדי לשמור את השינויים שעשויות להתרחש בדף הבסיס המוגדר כברירת מחדל עבור SharePoint Online, האפשרות מונחי-חיפוש ייצרו את חוויית המשתמש הטובה ביותר. אם אתה מעוניין של הקרקע התיכון פשוטה של ה-המוכנים לשימוש בניווט מובנה בין חיפוש, הניווט מנוהלים היא אפשרות טובה מאוד. ניתן לשמור את האפשרות ניווט מנוהל באמצעות תצורת, אינה כרוכה קבצי התאמה אישית של קוד, וזהו בהרבה מאשר של ה-המוכנים לשימוש בניווט מובנה.

גישה אחרת הוא ארגון מחדש של האתר הקיים ולצמצם את מספר פריטי ניווט ואתרי משנה נדרש. הסיבה לכך היא מבצעת בניווט מובנה היטב כל עוד מבנה האתר ואת הניווט אינה מורכב מדי.

מאמר זה משווה בין הגישות שונים באוסף אתרים דוגמה. אוסף האתרים דוגמה יש אתרי משנה 11 ומכילה כל אתר המשנה לפחות ארבעה אתרי משנה נוספים.

צילום מסך המציג אתרים ואתרי משנה

שימוש בניווט מובנה ב- SharePoint Online

פעולה זו היא הניווט של ה-המוכנים לשימוש המשמשות כברירת מחדל והיא הפתרון ברורות ואת המתאים ביותר ברוב הנסיבות. אלא אם כן יש מבנה מורכב של אתרי משנה מרובים או רמות רבות של אתרי משנה, בניווט מובנה מבצע היטב. יתרונות הראשי בגישה זו הם אותו הוא אבטחה-חיתוך, מעדכן באופן אוטומטי כאשר אתרים חדשים יתווספו אינו דורש כל התאמה אישית של הדף הראשי. משתמש לא טכניים יכולים גם להוסיף פריטים, הסתר פריטים, ולנהל בקלות הניווט מהדף ' הגדרות '.

הפעלת בניווט מובנה ב- SharePoint Online

כדי להדגים כיצד הביצועים ב- standard פתרון SharePoint Online בניווט מובנה והצג את אתרי המשנה האפשרות מופעלת. להלן הוא צילום מסך הגדרות נמצא בדף הגדרות האתר > ניווט.

צילום מסך המציג אתרי משנה

ניתוח ביצועים בניווט מובנה ב- SharePoint Online

כדי לנתח הביצועים של דף SharePoint להשתמש בכרטיסיה רשת של כלי פיתוח F12 ב- Internet Explorer.

צילום מסך המציג את הכרטיסיה 'רשת'' בכלי פיתוח F12

בכרטיסיה ' רשת ', לחץ על הדף. aspx אשר נטענת ולאחר מכן לחץ על הכרטיסיה פרטים.

צילום מסך המציג את הכרטיסיה 'פרטים'

לחץ על כותרות תגובה.

צילום מסך של הכרטיסיה 'פרטים'

SharePoint מחזירה מידע אבחון שימושי מסוימים בכותרות תגובה שלו. אחד היעיל ביותר הוא SPRequestDuration    שהוא הערך, באלפיות שניה, כמה זמן בקשה לקח לתהליך בשרת.

במסך הבא צילום הצג אתרי משנה אינה מסומנת עבור הניווט מבניות. פירוש הדבר שישנו רק את הקישור של אוסף אתרים בניווט הכללי:

צילום מסך המציג זמני טעינה כמשך זמן לבקשה

המפתח SPRequestDuration    מכיל ערך של 245 אלפיות שניה. פעולה זו מייצגת את הזמן שנדרש כדי להחזיר את הבקשה. כיוון שאין פריט אחד בלבד של הניווט באתר, זהו תקן ביצוע טובה עבור האופן שבו SharePoint Online מבצעת מבלי הניווט כבד. צילום המסך הבא מראה כיצד להוסיף אתרי המשנה משפיע על מפתח זה.

צילום מסך המציג משך זמן לבקשה של 2502 אלפיות שניה

הוספת אתרי המשנה הגדיל באופן משמעותי את הזמן שנדרש כדי להחזיר את בקשת דף.

היתרונות שבשימוש הניווט מובנות רגיל הוא שבאפשרותך בקלות לארגן את הסדר, להסתיר אתרים, להוסיף דפים, התוצאות אינן אבטחה-חיתוך, הם לא deviating מדפי הבסיס נתמכים בשימוש ב- SharePoint Online. אם מבנה האתר בקפידה למזער את אתרי המשנה באוסף האתרים שלך בניווט מובנה מבצע היטב.

שימוש ניווט מנוהל וכתובת מטה-נתונים מנוהלים ב- SharePoint Online

ניווט מנוהל היא אפשרות נוספת של ה-המוכנים לשימוש שבהם באפשרותך להשתמש כדי ליצור מחדש את אותו סוג של פונקציונליות כמו בניווט מובנה.

יתרון השימוש במטה-נתונים מנוהלים הוא אותו במהירות רבה יותר כדי לאחזר נתונים מהשימוש תוכן על-ידי שאילתה כדי לבנות את הניווט באתר. למרות שהיא שהרבה יותר מהר אין דרך לאבטחה trim התוצאות כך אם למשתמש אין גישה לאתר נתון, הקישור עדיין יוצג אך יובילו הודעת שגיאה.

כיצד ליישם ניווט מנוהל וכתובת התוצאות   

ישנם כמה מאמרים ב- TechNet בנוגע לפרטים ניווט מנוהל, לדוגמה, ראה מבט כולל על ניווט מנוהל ב- SharePoint Server 2013.

כדי ליישם ניווט מנוהל, תזדקק מונחים לאחסן הרשאות של מנהל מערכת. על-ידי הגדרת מונחים בעלי כתובת Url התואמים את המבנה של אוסף אתרים, ניתן להשתמש ניווט מנוהל להחלפת בניווט מובנה. לדוגמה:

צילום מסך של אתר משנה1 דוגמה

הדוגמה הבאה מציגה את הביצועים של הניווט מורכבות באמצעות ניווט מנוהל.

דוגמה לצילום מסך של SPRequestDuration

שימוש ניווט מנוהל באופן עקבי משפרת את הביצועים בהשוואה התוכן על-ידי שאילתה בגישה בניווט מובנה.

שימוש מונחי-חיפוש scripting בצד הלקוח

שימוש בחיפוש באפשרותך למנף את האינדקסים המובנות ברקע באמצעות סריקה רציפה. כלומר, אין שאילתות תוכן כבד. תוצאות החיפוש נמשכים אינדקס החיפוש והם התוצאות אבטחה-חיתוך. זהו מהיר יותר באמצעות שאילתות תוכן רגיל. באמצעות חיפוש בניווט מובנה, במיוחד אם יש לך מבנה אתר מורכבת, להאיץ טעינת זמן במידה ניכרת דף. היתרון הראשי התהליך מעל ניווט מנוהל הוא יועיל הגברת אבטחה.

גישה זו כרוכה יצירת דף בסיס מותאם אישית והחלפה של הקוד הניווט של ה-המוכנים לשימוש עם HTML מותאמים אישית. בצע את ההליך הבא כדי להחליף את קוד הניווט ב- seattle.html הקובץ.

בדוגמה זו, לפתוח את הקובץ seattle.html ולהחליף את הרכיב כולו id = "DeltaTopNavigation" עם קוד HTML מותאמים אישית.

דוגמה: כדי להחליף את קוד הניווט של ה-המוכנים לשימוש בדף ראשי

  1. נווט אל הדף הגדרות אתר.

  2. פתח את גלריית דפים ראשיים על-ידי לחיצה על עמודי בסיס.

  3. מכאן באפשרותך לנווט הספריה ולהוריד את הקובץ seattle.master.

  4. לערוך את הקוד באמצעות עורך טקסט ומחק את בלוק קוד בבצילום המסך הבא.

    צילום מסך של קוד DeltaTopNavigation למחיקה
  5. הסר את הקוד בין < מזהה SharePoint:AjaxDelta = "DeltaTopNavigation" > ו- < \SharePoint:AjaxDelta > תגי ולהחליף אותם מקטע הקוד הבא:

    <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. החלף את כתובת ה-URL בטעינת תמונה תג העוגן בהתחלה, עם קישור תמונת טעינה באוסף האתרים שלך. לאחר שביצעת את השינויים, שנה את שם הקובץ ולאחר מכן העלה אותה בגלריית דף הבסיס. פעולה זו יוצרת קובץ. master חדש.

  7. HTML הוא הסימונים בסיסיות שיאוכלס על-ידי תוצאות החיפוש המוחזרות קוד JavaScript. יהיה עליך לערוך את הקוד הבא כדי לשנות את הערך עבור var root = “site collection URL כפי שמתואר ב- מקטע הקוד הבא:

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

    קובץ JavaScript כולו הוא כדלקמן:

    //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");
    

    כדי לסכם את הקוד המוצג לעיל בפונקציה $(document).ready jQuery אובייקט viewModel שנוצרו ולאחר מכן loadNavigationNodes() לפעול על אותו אובייקט נקרא '. פונקציה זו טוען לאי בהירארכיית הניווט שנבנה בעבר המאוחסנים באחסון מקומי HTML5 של הדפדפן לקוח או הוא קורא את הפונקציה queryRemoteInterface().

    QueryRemoteInterface() בונה בקשה באמצעות הפונקציה getRequest() עם פרמטר השאילתה המוגדרות על-ידי מוקדם יותר בערכת בקובץ ה-script, ולאחר מכן החזרת נתונים מהשרת. נתונים אלה הוא למעשה מערך של כל האתרים באוסף האתרים שמיוצגות אובייקטים העברת נתונים עם מאפיינים שונים. נתונים אלה מכן לנתח לתוך האובייקטים שהוגדרה קודם לכן SPO.Models.NavigationNode להשתמש בהם Knockout.js כדי ליצור מאפיינים observable לשימוש על-ידי נתונים איגוד הערכים לתוך ה-HTML שהגדרנו קודם לכן. מערך תוצאות מכן נכנסות האובייקטים. מערך זה הוא לנתח לתוך JSON באמצעות ההסתרה ומאוחסנים באחסון בדפדפן המקומי לקבלת ביצועים משופרים על טעינות הדף בעתיד.

  8. לאחר מכן, התוצאות הוקצו המערך self.nodes והירארכיה בנוי מחוץ האובייקטים באמצעות linq.js מקצה הפלט מערך self.heirarchy. מערך זה הוא אובייקט המאוגד ל- HTML. פעולה זו נעשית בפונקציה toggleView() על-ידי העברת האובייקט עצמי לפונקציה ko.applyBinding() . לאחר מכן, הדבר גורם המערך הירארכיה שיש לאגד ה-HTML הבא:

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

    לבסוף, באירועים עבור mouseenter ו- mouseexit נוסף הניווט ברמה העליונה כדי לטפל התפריטים נפתח אתר משנה שבו מתבצע בפונקציה addEventsToElements() .

    ניתן לראות את התוצאות של הניווט במסך צילום להלן:

    צילום מסך של תוצאות ניווט

    בדוגמה שלנו הניווט מורכבות עמוד רענן טעינה ללא מציג האחסון במטמון המקומי הזמן שהוקדש בשרת מכיל שאוחסן גזירת מהניווט מבניים בחינת כדי לקבל תוצאות דומות בתור הגישה ניווט מנוהל.

    צילום מסך של SPRequestDuration 301

    אחד היתרונות העיקריים בגישה זו הוא בו באמצעות אחסון מקומי ב- HTML5, הניווט מאוחסנים באופן מקומי עבור המשתמש בפעם הבאה שהם טעינת הדף.

אנו מקבלים שיפורים בביצועים העיקריים משימוש החיפוש API בניווט מובנה; עם זאת, נדרשים כמה יכולת טכנית לבצע ולהתאמה אישית פונקציונליות זו. ביישום דוגמה, האתרים הסידור באותו אופן בתור בניווט מובנה של ה-המוכנים לשימוש; בסדר אלפביתי. אם תרצה לסטות מסדר המעבר באמצעות מקש זה, יהיה מורכב יותר לפתח והתחזוקה. כמו כן, גישה זו דורשת לסטות מדפי הבסיס נתמכים. אם דף הבסיס המותאם אישית אינו נשמר, האתר שלך מחמיץ החוצה באלה עדכונים ושיפורים שהופך לדפים ראשיים של Microsoft.

הקוד שלעיל מכיל את יחסי התלות הבאים:

הגירסה הנוכחית של LinqJS אינו מכיל את השיטה ByHierarchy המשמשת את הקוד לעיל ולאחר ינתק את הקוד הניווט. כדי לתקן זאת, הוסף את השיטה הבאה לקובץ Linq.js לפני השורה "Flatten: יתפקד ()".

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

הערה: כתב ויתור בנוגע לתרגום מכונה: מאמר זה תורגם על-ידי מערכת מחשב, ללא התערבות אדם. Microsoft מציעה את תרגומי המכונה כדי לסייע למשתמשים שאינם דוברי אנגלית ליהנות מתוכן בנושא מוצרים, שירותים וטכנולוגיות של Microsoft. מכיוון שהמאמר תורגם על-ידי מכונה, הוא עלול להכיל שגיאות באוצר המילים, בתחביר או בדקדוק.

הרחב את הכישורים שלך
סייר בהדרכה
קבל תכונות חדשות לפני כולם
הצטרף למשתתפי Office Insider

האם מידע זה היה שימושי?

תודה על המשוב!

תודה על המשוב! נראה שכדאי לקשר אותך לאחד מנציגי התמיכה של Office.

×