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


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

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

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

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

Використання App.Formulas замість App.OnStart

Порада

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

Найкращий спосіб скоротити час завантаження як для вас 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 в App.OnStart на іменовані формули в App.Formulas. В інших мовах програмування багаторазово використовувані частини часто називають підпрограмами або функціями, визначеними користувачем. Ви можете думати про іменовані формули як про просту форму визначеної користувачем функції без параметрів або побічних ефектів.

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

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

Наприклад, один із екранів у зразку рішення для реагування на невідкладну допомогу в лікарні містить таку логіку в 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 and Launch, а також запису значень у базу даних за допомогою Patch, SubmitForm або RemoveIf. ·

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

  1. Додавання елемента керування «Кнопка » на екран.
  2. Встановіть для властивості OnSelect імперативну логіку, яку ви хочете виконати.
  3. Установіть для властивості Видимий значення 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 Response Sample Solution Canvas, запущеної на телефоні, на якому показано компонент полотна розподільного щита.

Коли користувач вибирає область, компонент використовує метадані про доступні програми та про те, яка програма розміщує цей компонент. Якщо потрібний екран знаходиться в цьому додатку (тобто,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 .

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

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

Примітка

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

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