Поділитися через


Створюйте великі та складні програми на полотні

Більшість статей у цьому розділі документації присвячено продуктивності програм під час виконання з урахуванням досвіду людей, які їх використовують. У цій статті розглядається продуктивність додатків як їх відчувають люди, які їх створюють.

У міру того, як програми стають все більшими та складнішими, Power Apps Studio їм потрібно завантажувати та керувати більшою кількістю елементів керування, формул і джерел даних, і все це з взаємозалежностями, які зростають у геометричній прогресії. Power Apps Studio може завантажуватися довше, а такі функції, як IntelliSense і колірне кодування, можуть затримуватися. Використовуйте наведені нижче рекомендації для кращої роботи з великими та складними програмами в Power Apps Studio. Вони також можуть допомогти покращити продуктивність ваших програм під час виконання.

У прикладах у цій статті використовується зразок розчину для відповідей надзвичайних ситуацій у лікарнях.

Використовуйте App.Formulas замість App.OnStart

Підказка

Користувацькі властивості виводу компонента With function та canvas component можна використовувати як альтернативу іменованим формулам.

Найкращий спосіб скоротити час завантаження як для того, ні для іншого Power Apps Studio та вашого додатка – замінити ініціалізацію змінних та колекції в App.OnStart іменованими формулами в App.Formulas.

Давайте розглянемо наступний приклад, в якому використовується App.OnStart.

// Get the color of text on a dark background.
Set(varColorOnDark,RGBA(0, 0, 0, 1));

// Get the color of the menu icons.
Set(varColorMenuIcon,"#0070a9");

// Get the styles for a form.
Set(varFormStyle,
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    }
);

ClearCollect(
    FacilitiesList,
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    )
);
If(
    Not IsBlank(Param("FacilityID")),
    Set(ParamFacility,
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name
    );
);

Оскільки ці твердження є послідовністю, ваш додаток має оцінювати ці виклики в порядку, перш ніж відображати перший екран, що сприяє повільнішому завантаженню програми. І оскільки весь App.OnStart повинен розглядатися як єдине ціле, зберігати порядок і агрегувати помилки перед поверненням кінцевого результату, формула складна для Power Apps Studio аналізу.

Є кращий спосіб. Замість цього використовуйте App.Formulas і визначте ці змінні та колекції як іменовані формули, як у наступному прикладі.

// Get the color of text on a dark background.
varColorOnDark = RGBA(0, 0, 0, 1);

// Get the color of the menu icons.
varColorMenuIcon = "#0070a9";

// Get the styles for a form.
varFormStyle = 
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    };

FacilitiesList =
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    );

ParamFacility = 
    If( Not IsBlank(Param("FacilityID")),
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name,
        Blank()
    );

Ця зміна може здатися незначною, але вона може мати величезний вплив. Оскільки кожна названа формула не залежить від інших, Power Apps Studio можна аналізувати їх незалежно, ефективно розбиваючи великий App.OnStart на менші частини. Ми побачили, що Power Apps Studio час завантаження скоротився на цілих 80% лише завдяки цій зміні.

Ваш додаток також завантажується швидше, оскільки йому не потрібно оцінювати ці формули, доки йому не знадобиться результат. Перший екран програми відображається відразу.

Іменовані формули можна використовувати не в усіх ситуаціях, оскільки їх не можна змінювати або використовувати з параметром «Встановити». У деяких ситуаціях потрібне використання змінної стану, яку можна змінювати. Набір ідеально підходить для таких ситуацій і ви повинні продовжувати його використовувати. Але найчастіше ви використовуєте глобальні змінні в OnStart, щоб налаштувати статичні значення, які не змінюються. У таких випадках кращим вибором буде іменована формула.

Оскільки іменовані формули є незмінними, префікс var (скорочення від «змінна») як домовленість про іменування більше не підходить. У цьому прикладі ми не змінювали назви, тому що для цього потрібні були зміни в решті програми.

Є спокуса помістити іменовану формулу в App.OnStart, але не робіть цього. Їм там не місце. Як властивість поведінки On, App.OnStart оцінює кожен зі своїх тверджень по порядку, створюючи глобальні змінні та спілкуючись з базами даних лише один раз, коли додаток завантажується. Іменовані формули — це формули, які визначають, як обчислити щось, коли це необхідно, і завжди вірні. Саме ця формула дозволяє їм бути незалежними та дозволяє додатку завершити завантаження до того, як їх оцінять.

Розбиття довгих формул

App.OnStart є одним з найгірших порушників довгих формул і безумовно, з чого варто почати, але це не єдиний випадок.

Наші дослідження показали, що майже всі програми з тривалим часом Power Apps Studio завантаження мають принаймні одну формулу з понад 256 000 символів. Деякі програми з найдовшим часом завантаження мають формули понад 1 мільйон символів. Формули, які довго дають значне навантаження Power Apps Studio.

Що ще гірше, копіювання та вставлення елемента керування з довгою формулою дублює формулу у властивостях елемента керування без її реалізації. Power Apps створено за зразком Excel, де поширені кілька копій формули. Однак в Excel формули обмежені одним виразом і обмежені 8 000 символами. Power Apps Формули можуть стати набагато довшими з введенням імперативної логіки та оператора ланцюжка (; або ;;, залежно від локалі).

Загальне рішення полягає в тому, щоб розбити довгі формули на менші частини та повторно використовувати частини, як ми зробили в попередньому розділі, коли змінили Set/Collect statements in App.OnStart на іменовані формули в App.Formulas. В інших мовах програмування багаторазово використовувані частини часто називають підпрограмами або функціями, визначеними користувачем. Ви можете думати про іменовані формули як про просту форму визначеної користувачем функції без параметрів або побічних ефектів.

Використовуйте іменовані формули всюди

У попередньому прикладі ми використовували іменовані формули як заміну App.OnStart. Однак ви можете використовувати їх, щоб замінити обчислення в будь-якому місці програми.

Наприклад, один з екранів у зразковому рішенні Hospital Emergency відповідь включає таку логіку в Screen.OnVisible:

ClearCollect(
    MySplashSelectionsCollection,
    {
        MySystemCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).System.'System Name',
        MyRegionCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).'Region Name',
        MyFacilityCol: ParamFacility,
          MyFacilityColID:  LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Id
    }
); 

Цю формулу можна розбити на набір іменованих формул. Це також полегшує читання формули.

MyRegion = LookUp(
                    Regions,
                    Region = MyParamRegion
           );

MyFacility = LookUp(
                    FacilitiesList,
                    Id = GUID(Param("FacilityID")
            );

MySplashSelectionsCollection = 
    {
        MySystemCol: MyRegion.System.'System Name',
        MyRegionCol: MyRegion.'Region Name',
        MyFacilityCol: ParamFacility,
        MyFacilityColID:  MyFacility.Id
    };

Ми витягли ParamFacility як іменовану формулу раніше, коли перемістили більшість викликів набору з App.OnStart до іменованих формул у App.Formulas .

Іменовані формули обчислюються лише тоді, коли потрібні їхні значення. Якщо початкова мета використання Screen.OnVisible полягала в тому, щоб відкласти роботу до відображення екрана, то робота все одно відкладається як глобальні іменовані формули в App.Formulas.

Використовуйте функцію «З»

Ви також можете використовувати функцію With у формулі для поділу логіки. Створіть запис у першому параметрі зі значеннями, які потрібно використовувати як поля, а потім використовуйте ці поля другого параметра для обчислення значення, що повертається з поля З. Наприклад, попередній приклад можна записати у вигляді лише однієї іменованої формули:

MySplashSelectionsCollection = 
    With( { MyRegion: LookUp(
                            Regions,
                            Region = MyParamRegion
                      ),
            MyFacility: LookUp(
                            FacilitiesList,
                            Id = GUID(Param("FacilityID")
                      ) 
           },
           {
                MySystemCol: MyRegion.System.'System Name',
                MyRegionCol: MyRegion.'Region Name',
                MyFacilityCol: ParamFacility,
                MyFacilityColID:  MyFacility.Id
           }
    )

Одним із недоліків використання With this way є те, що MyFacility їх не можна використовувати MyRegion , оскільки вони визначені в одній і тій самій функції With, проблема, якої немає з іменованими формулами. Одним із рішень є вкладення функцій With і використання ключового слова As для іменування запису для кожної з них, щоб забезпечити легкий доступ до всіх змінних With .

Використовуйте компоненти полотна

Компоненти полотна найчастіше використовуються для створення елемента керування інтерфейсом користувача, який можна розмістити на полотні так само, як елемент керування. Ви також можете використовувати їх, не розміщуючи в інтерфейсі користувача, для виконання обчислень із користувацькими властивостями виводу як альтернативу іменованим формулам. Компоненти Canvas легко спільно використовувати в програмах за допомогою бібліотек компонентів і, на відміну від іменованих формул, повністю підтримуються. Однак їх складніше налаштувати та використовувати, ніж іменні формули.

Щоб розділити логіку:

  1. У Power Apps Studio режимі перегляду дерева перейдіть на вкладку Компоненти.
  2. Створення нового компонента.
  3. В області властивостей увімкніть параметр Область програми Access.
  4. Додайте власну властивість.
  5. Встановіть для параметра Тип властивості значення Вивід і тип даних відповідно.
  6. Виберіть Створити.
  7. У засобі вибору властивостей поруч із рядком формул у верхній частині екрана виберіть нову властивість.
  8. Напишіть формулу для поділу та повторного використання логіки.

Щоб скористатися логікою:

  1. Перейдіть на вкладку Екрани в режимі перегляду дерева.
  2. В області Вставка розгорніть пункт Користувацький і вставте компонент.
  3. Щоб обчислити значення з властивістю, використовуйте ComponentName.PropertyName.

Використання функції «Вибрати» з прихованим елементом керування для імперативної логіки

Імперативна логіка використовується для зміни стану за допомогою Set and Collect , сповіщення користувача за допомогою Notify, переходу на інший екран або програму за допомогою Navigate та Launch, а також запису значень до бази даних за допомогою Patch, SubmitForm або RemoveIf ·. ·

Іменовані формули та користувацькі властивості виводу компонентів полотна не підтримують імперативну логіку. Поширеним способом поділу імперативної логіки є використання властивості OnSelect прихованого елемента керування.

  1. Додайте елемент керування кнопкою на екран.
  2. Встановіть для властивості OnSelect імперативну логіку, яку ви хочете виконати.
  3. Встановіть для властивості Visible значення false, оскільки користувачеві не потрібно бачити її або взаємодіяти з нею.
  4. Телефонуйте Select( Button ) , коли хочете виконати імперативну логіку.

Наприклад, один з екранів у нашому зразку має наступну властивість OnSelect на елементі керування Button . (Цей простий приклад наведено лише для ілюстрації. Як правило, ви використовуєте цю техніку лише для довших формул.)

btnAction_17.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in the OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

Щоб розбити цю логіку на частини, ми можемо помістити частини на окремі елементи керування кнопками та вибрати їх з оригіналу:

btnTrace.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);

btnSubmit.OnSelect = 
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

btnAction_17.OnSelect = 
    Select( btnTrace );
    Select( btnSubmit );

Ця техніка працює лише на одному екрані. Інші методи, які є трохи складнішими, працюють на різних екранах, наприклад, використання елемента керування Toggle, встановлення OnCheck на логіку, яку ви хочете запустити, і встановлення Default на глобальну змінну, а потім перемикання глобальної змінної з Set( global, true ); Set( global, false ) точкою, яку ви хочете запустити логіку.

У цьому прикладі вже було зроблено деяке розбиття логіки. У коментарі згадується, що «Подальші дії можна знайти в OnSuccess». Ця подія запускає імперативну логіку після успішного надсилання запису, рішення, специфічне для функції SubmitForm .

Розмістіть програму на розділи

Деякі програми розростаються до тисяч елементів керування та сотень джерел даних, що сповільнюється Power Apps Studio. Як і у випадку з довгими формулами, великі програми можна розділити на менші розділи, які працюють разом, щоб створити єдиний користувацький досвід.

Окремі програми для роботи з полотном

Один із підходів полягає в тому, щоб впровадити розділи в окремі програми на полотні та використовувати функцію запуску для навігації між окремими програмами та передачі необхідного контексту.

Цей підхід був використаний у зразковому розчині Hospital Emergency відповідь. Окремі програми керують кожною з основних областей загальної програми. Програми мають спільний компонент switchboard через бібліотеку компонентів, яку кожна програма показує на екрані запуску:

Знімок екрана програми «Полотно для відповідей надзвичайних ситуацій у лікарні», запущеного на телефоні, на якому показано компонент полотна розподільного щита.

Коли користувач вибирає область, компонент використовує метадані про доступні програми та програму, на якій розміщено цей компонент. Якщо потрібний екран знаходиться в цьому додатку (тобто,ThisItem.Screen · не порожній), то здійснюється дзвінок Navigate . Але якщо потрібний екран знаходиться в іншому додатку (тобто,ThisItem.PowerAppID · не порожній), то використовується функція Launch з App ID цілі та контекстом FacilityID:

If(
    IsBlank(ThisItem.Screen),
    If(IsBlank(ThisItem.PowerAppID), 
        Launch(ThisItem.URL),           
        Launch("/providers/Microsoft.PowerApps/apps/" & ThisItem.PowerAppID, 
               "FacilityID", Home_Facility_DD.Selected.Id)
    ),
    Navigate(
        ThisItem.Screen,
        Fade
    )
);

Стан у вихідній програмі втрачається під час запуску іншої програми. Обов’язково збережіть будь-який стан, перш ніж викликати функцію запуску . Запишіть його в базу даних, викличте SaveData або передайте стан цільовій програмі з параметрами, які зчитуються за допомогою функції Param .

Додаток на основі моделі з користувацькими сторінками

Розділи також можуть бути реалізовані у вигляді користувацьких сторінок. Користувацькі сторінки діють як міні-програма на полотні з контейнером для навігації на основі моделі.

Примітка

Розкажіть нам про свої уподобання щодо мови документації? Візьміть участь в короткому опитуванні. (зверніть увагу, що це опитування англійською мовою)

Проходження опитування займе близько семи хвилин. Персональні дані не збиратимуться (декларація про конфіденційність).