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


Объект App в Power Apps

Применимо к: приложениям Canvas

Получите сведения о текущем работающем приложении и управляйте поведением приложения.

Описание

Как и элемент управления, объект App имеет свойства, определяющие, какой экран отображается и запрашивать сохранение изменений, чтобы они не потеряли. Каждое приложение имеет объект App.

Напишите формулы для некоторых свойств объекта App . Вверху панели Представление в виде дерева выберите объект App, как вы выбираете любой другой элемент управления или экран. Чтобы просмотреть или изменить одно из свойств объекта, выберите его в раскрывающемся списке слева от строки формул.

Снимок экрана: объект App, выбранный в области представления

Свойство ActiveScreen

Свойство ActiveScreen определяет экран, отображаемый в данный момент.

Это свойство возвращает объект экрана. Используйте его для ссылки на свойства текущего экрана, например имя с помощью формулы App.ActiveScreen.Name. Это свойство также можно сравнить с другим объектом экрана, например с формулой сравнения App.ActiveScreen = Screen2 , чтобы проверить, является ли Экран2 текущим.

Используйте функцию Back или Navigate , чтобы переключить отображаемый экран.

Свойство BackEnabled

Свойство BackEnabled изменяет способ реагирования приложения на жест обратного устройства (проводите пальцем или используйте кнопку "Назад" на устройствах Android или проводите пальцем влево на устройствах iOS) при запуске в Power Apps mobile. При включении жест обратного устройства возвращается на экран, который был недавно показан, который похож на формулу Back . При отключении жест обратного устройства принимает пользователя в список приложений.

Свойства ConfirmExit

Никто не хочет терять несохраненные изменения. Используйте свойства ConfirmExit и ConfirmExitMessage , чтобы предупредить пользователя перед закрытием приложения.

Заметка

  • ConfirmExit не работает в приложениях, внедренных в Power BI и SharePoint.
  • ConfirmExit не поддерживается на пользовательских страницах.
  • Теперь эти свойства могут ссылаться на элементы управления только на первом экране, если включена функция предварительной версии отложенной загрузки (которая по умолчанию используется для новых приложений). Если вы ссылаетесь на другие экраны, Power Apps Studio не отображает ошибку, но опубликованное приложение не открывается в Power Apps Mobile или браузере. Мы работаем над этим ограничением. В то же время отключите задержку загрузки впредстоящих функциях>параметров(в разделе "Предварительная версия").

ConfirmExit

ConfirmExit — это логическое свойство, которое, когда значение true, открывает диалоговое окно подтверждения перед закрытием приложения. По умолчанию это свойство имеет значение false, и никакое диалоговое окно не появляется.

Если у пользователя могут быть несохраненные изменения в приложении, используйте это свойство для отображения диалогового окна подтверждения перед выходом из приложения. Используйте формулу, которая проверяет переменные и свойства элемента управления (например, свойство Unsaved элемента управления формы Edit ).

Диалоговое окно подтверждения отображается в любой ситуации, когда данные могут быть потеряны, например:

  • Запустите функцию Exit .
  • Если приложение выполняется в браузере:
    • Закройте браузер или вкладку браузера, на которой выполняется приложение.
    • Нажмите кнопку "Назад" браузера.
    • Запустите функцию запуска с помощью LaunchTargetself.
  • Если приложение работает в Power Apps Mobile (iOS или Android):
    • Проводите пальцем, чтобы перейти к другому приложению в Power Apps Mobile.
    • Нажмите кнопку "Назад" на устройстве Android.
    • Запустите функцию запуска , чтобы запустить другое приложение холста.

Точное представление диалогового окна подтверждения может различаться на устройствах и версиях Power Apps.

Диалоговое окно подтверждения не отображается в Power Apps Studio.

ConfirmExitMessage

По умолчанию в диалоговом окне подтверждения отображается общее сообщение, например "У вас могут быть несохраненные изменения." на языке пользователя.

Используйте ConfirmExitMessage, чтобы предоставить пользовательское сообщение в диалоговом окне подтверждения. Если это свойство пусто, используется значение по умолчанию. Пользовательские сообщения усечены по мере необходимости в диалоговом окне подтверждения, поэтому не более нескольких строк.

В браузере диалоговое окно подтверждения может отображать универсальное сообщение из браузера.

Заметка

Объект App имеет два дополнительных свойства, OnMessage а BackEnabledтакже экспериментальные. Эти свойства удаляются из объекта приложения в конечном итоге. Не используйте эти свойства в рабочей среде.

Пример

  1. Установите для свойства ConfirmExit объекта App следующее выражение:

    AccountForm.Unsaved Or ContactForm.Unsaved
    

    В диалоговом окне показано, изменяет ли пользователь данные в любой форме, а затем пытается закрыть приложение без сохранения этих изменений. Пользователь изменяет данные в любой форме, а затем пытается закрыть приложение без сохранения этих изменений.

    [!div clas1. Установите для свойства ConfirmExitMessage объекта App следующую формулу:

    If( AccountsForm.Unsaved,
        "Accounts form has unsaved changes.",
        "Contacts form has unsaved changes."
    )
    

    В диалоговом окне показано, изменяет ли пользователь данные в форме учетной записи, а затем пытается закрыть приложение без сохранения этих изменений.

    Диалоговое окно подтверждения для конкретной формы.

Настройка строки подключения для Application Insights

Чтобы экспортировать системные журналы приложений в Application Insights, настройте строку подключения для приложения холста.

  1. Откройте ваше приложение для редактирования в Power Apps Studio.
  2. Выберите объект Приложение из представления дерева в левой навигации.
  3. Введите строку подключения в области свойств.

Если данные не отправляются в Application Insights, обратитесь к администратору Power Platform и проверьте, отключен ли App Insights на уровне клиента.

Свойство формул

Используйте именованные формулы в свойстве Формулы, чтобы определить формулу, которую можно повторно использовать в приложении.

В Power Apps значение свойств элемента управления определяется формулами. Например, чтобы установить согласованный цвет фона для всего приложения, вы можете установить свойство Заливка для каждого равным общей формуле:

Label1.Fill: ColorValue( Param( "BackgroundColor" ) )
Label2.Fill: ColorValue( Param( "BackgroundColor" ) )
Label3.Fill: ColorValue( Param( "BackgroundColor" ) )

С таким количеством мест, где может появиться эта формула, становится утомительным и подверженным ошибкам обновлять их все, если требуется изменение. Вместо этого вы можете создать глобальную переменную OnStart, чтобы установить цвет один раз, а затем повторно использовать значение во всем приложении:

App.OnStart: Set( BGColor, ColorValue( Param( "BackgroundColor" ) ) )
Label1.Fill: BGColor
Label2.Fill: BGColor
Label3.Fill: BGColor

Хотя этот метод лучше, он также зависит от выполнения OnStart до того, как будет задано значение BGColor. BGColor также могут быть изменено в каком-то уголке приложения, о котором разработчик не знает, изменение, внесенное кем-то другим, и это может быть трудно отследить.

Именованные формулы предоставляют альтернативу. Так же, как мы обычно пишем свойство-элемента-управления = выражение, мы можем вместо этого написать имя = выражение, а затем повторно использовать имя во всем нашем приложении, чтобы заменить выражение. Определения этих формул даны в свойстве Формулы:

App.Formulas: BGColor = ColorValue( Param( "BackgroundColor" ) );
Label1.Fill: BGColor
Label2.Fill: BGColor
Label3.Fill: BGColor

К преимуществам использования именованных формул относятся:

  • Значение формулы всегда доступно. Тут нет временной зависимости, нет события OnStart, которое должно выполняться первым, прежде чем значение будет установлено, и нет времени, когда значение формулы будет неправильным. Именованные формулы могут ссылаться друг на друга в любом порядке, если они не создают циклическую ссылку. Их можно вычислять параллельно.
  • Значение формулы всегда актуально. Формула может выполнять вычисления, зависящие от свойств элемента управления или записей базы данных, и по мере их изменения значение формулы автоматически обновляется. Вам не нужно вручную обновлять значение, как в случае с переменной. И формулы пересчитываются только при необходимости.
  • Определение формулы неизменно. Определение в Формулы является единственным источником достоверной информации, и значение нельзя изменить где-либо еще в приложении. В случае с переменными возможно, что какой-то код неожиданно изменит значение, но эта сложная для отладки ситуация невозможна с именованными формулами.
  • Вычисление формулы можно отложить. Поскольку это значение неизменно, его всегда можно вычислить при необходимости, а это означает, что его не нужно вычислять до тех пор, пока оно не понадобится. Значения формулы, которые не используются до отображения экрана2 приложения, не нужно рассчитывать до тех пор, пока не будет отображаться экран2. Откладывание этой работы может сократить время загрузки приложения. Именованные формулы являются декларативными и предоставляют системе возможность оптимизировать способ и время их вычисления.
  • Именованные формулы — это концепция Excel. Power Fx по возможности использует концепции Excel, поскольку многие люди хорошо знают Excel. Именованные формулы эквивалентны именованным ячейкам и именованным формулам в Excel, управляемым с помощью диспетчера имен. Они пересчитываются автоматически, как это делают ячейки электронной таблицы и свойства элемента управления.

Именованные формулы определяются одна за другой в свойстве Формулы, каждая из которых заканчивается точкой с запятой. Тип формулы определяется типами элементов в формуле и тем, как они используются вместе. Например, эти именованные формулы извлекают полезную информацию о текущем пользователе из Dataverse:

UserEmail = User().Email;
UserInfo = LookUp( Users, 'Primary Email' = User().Email );
UserTitle = UserInfo.Title;
UserPhone = Switch( UserInfo.'Preferred Phone', 
                    'Preferred Phone (Users)'.'Mobile Phone', UserInfo.'Mobile Phone',
                    UserInfo.'Main Phone' );

Если формулу для UserTitle необходимо обновить, это можно легко сделать в этом одном месте. Если UserPhone не нужен в приложении, то эти обращения к таблице Пользователи в Dataverse не делаются. Нет штрафа за включение определения формулы, которая не используется.

Некоторые ограничения именованных формул:

  • Они не могут использовать функции поведения или иным образом вызывать побочные эффекты в приложении.
  • Они не могут создать циклическую ссылку. Наличие a = b; и b = a; в одном и том же приложении не допускается.

Функции, определяемые пользователем

Power Fx включает длинный список встроенных функций, таких как If, Text и Set. Пользовательские функции позволяют писать собственные функции, которые принимают параметры и возвращают значение, так же, как это делают встроенные функции. Пользовательские функции можно рассматривать как расширение именованных формул, которое добавляет параметры и поддерживает формулы поведения.

Например, можно определить именованную формулу, которая возвращает художественную литературу из библиотеки:

Library = [ { Title: "The Hobbit", Author: "J. R. R. Tolkien", Genre: "Fiction" },
            { Title: "Oxford English Dictionary", Author: "Oxford University", Genre: "Reference" } ];

LibraryFiction = Filter( Library, Genre = "Fiction" );

Без параметров нам пришлось бы определять отдельные именованные формулы для каждого жанра. Но вместо этого давайте параметризуем нашу именованную формулу:

LibraryType := Type( [ { Title: Text, Author: Text, Genre: Text } ] );

LibraryGenre( SelectedGenre: Text ): LibraryType = Filter( Library, Genre = SelectedGenre );

Теперь мы можем вызывать LibraryGenre( "Fiction" ), LibraryGenre( "Reference" ) или фильтровать другие жанры с помощью одной пользовательской функции.

Синтаксис следующий:

FunctionName( [ ParameterName1: ParameterType1 [ , ParameterName2: ParameterType2 ... ] ] : ReturnType = ;

  • FunctionName — обязательный параметр. Имя определенной пользователем функции.
  • ParameterName — необязательный параметр. Имя параметра функции.
  • ParameterType — необязательный параметр. Имя типа, имя встроенного типа данных, имя источника данных или тип, определенный с помощью функции Type.
  • ReturnType — обязательный аргумент. Тип возвращаемого значения функции.
  • Formula — обязательный аргумент. Формула, которая вычисляет значение функции на основе параметров.

Каждый параметр и выходные данные пользовательской функции должны быть типизированы. В этом примере, SelectedGenre: Text определяет первый параметр нашей функции как тип Text, и SelectedGenre — это имя параметра, которое используется в теле для операции Filter. Поддерживаемые имена типов см. в разделе Типы данных. Функция Type используется для создания агрегатного типа для нашей библиотеки, чтобы мы могли вернуть таблицу книг из нашей функции.

Мы определили LibraryType как тип записей таблицы во множественном числе. Если мы хотим передать в функцию одну книгу, мы можем извлечь тип записи для этой таблицы с помощью функции RecordOf:

BookType := Type( RecordOf( LibraryType ) );

IsGenre( Book: BookType, SelectedGenre: Text ): Boolean = (Book.Genre = SelectedGenre);

Сопоставление записей для параметров функции более строгое, чем в других частях Power Fx. Поля значения записи должны быть правильным подмножеством определения типа и не могут содержать дополнительные поля. Например, IsGenre( { Title: "My Book", Published: 2001 }, "Fiction" ) приведет к ошибке.

Обратите внимание, что рекурсия пока не поддерживается пользовательскими функциями.

Поведения определяемых пользователем функций

Именованные формулы и большинство пользовательских функций не поддерживают функции поведения с побочными эффектами, такие как Set или Notify. Как правило, по возможности лучше избегать обновления состояния, вместо этого полагаясь на шаблоны функционального программирования и позволяя Power Fx автоматически пересчитывать формулы по мере необходимости. Но бывают случаи, когда это неизбежно. Чтобы включить логику поведения в пользовательскую функцию, заключите тело в фигурные скобки:

Spend( Amount: Number ) : Void = {
    If( Amount > Savings, 
        Error( $"{Amount} is more than available savings" ),
        Set( Savings, Savings - Amount );
        Set( Spent, Spent + Amount) 
    );
}

Теперь мы можем вызвать Spend( 12 ), чтобы проверить, есть ли у нас 12 в наших сбережениях, и если да, то дебетовать их на 12 и добавить 12 к переменной "Потрачено". Тип возвращаемого значения этой функции — Void, так как она не возвращает значение.

Синтаксис определяемой пользователем функции поведения выглядит следующим образом:

FunctionName( [ ParameterName1: ParameterType1 [ , ParameterName2: ParameterType2 ... ] ] : ReturnType = { Formula1 [ ; Формула2 ... ] };

  • FunctionName — обязательный параметр. Имя определенной пользователем функции.
  • ParameterName — необязательный параметр. Имя параметра функции.
  • ParameterType — необязательный параметр. Имя типа, имя встроенного типа данных, имя источника данных или тип, определенный с помощью функции Type.
  • ReturnType — обязательный аргумент. Тип возвращаемого значения функции. Используйте Void , если функция не возвращает значение.
  • Formula(s) — обязательный параметр. Формула, которая вычисляет значение функции на основе параметров.

Как и в случае со всеми формулами Power Fx, выполнение не заканчивается при обнаружении ошибки. После вызова функции Errorфункция If предотвращает внесение изменений в параметры Сбережения и Потрачено. Функцию IfError также можно использовать для предотвращения дальнейшего выполнения после ошибки. Несмотря на то, что формула возвращает значение Void, она все равно может вернуть ошибку при возникновении проблемы.

Пользовательские типы

Внимание!

Именованные формулы можно использовать с функцией Type для создания пользовательских типов. Используйте := вместо = для определения пользовательского типа, например Book := Type( { Title: Text, Author: Text } ). Дополнительные сведения и примеры см. в разделе Функция Type.

Свойство OnError

Используйте OnError, чтобы принять меры при возникновении ошибки в любом месте приложения. Это предоставляет глобальную возможность перехватить баннер ошибки до его показа конечному пользователю. Его также можно использовать для регистрации ошибок с помощью функции Trace или записать в базу данных или веб-службу.

В приложениях на основе холста результат каждого вычисления формулы проверяется на наличие ошибки. Если возникла ошибка, OnError вычисляется с теми же переменными области FirstError и AllErrors, которые использовались бы, если бы вся формула была заключена в функцию IfError.

Если OnError пуст, по умолчанию отображается баннер ошибки FirstError.Message ошибки. Определение формулы OnError переопределяет это поведение, поэтому производитель может обрабатывать отчеты об ошибках по мере необходимости. Вы можете запросить поведение по умолчанию в OnError, повторно выполнив ошибку с помощью функции Error. Используйте подход повторного увеличения, если вы хотите отфильтровать или обрабатывать некоторые ошибки по-другому, но позвольте другим пройти через него.

OnError не может заменить ошибку в расчетах так, как это может IfError. Если вызывается OnError, ошибка уже произошла, и она уже была обработана посредством вычислений по формуле, такой как IfError; OnError контролирует только отчетность об ошибке.

Формулы OnError оцениваются параллельно, и возможно, что их оценка может перекрываться обработкой других ошибок. Например, если вы задаете глобальную переменную в верхней части OnError и считываете ее позже в той же формуле, это значение может измениться. Используйте функцию With для создания именованного значения, которое является локальным для формулы.

Хотя каждая ошибка обрабатывается по отдельности OnError, баннер ошибок по умолчанию может не отображаться для каждой ошибки по отдельности. Чтобы избежать одновременного отображения слишком большого количества баннеров ошибок, один и тот же баннер ошибки не будет отображаться повторно, если он был недавно показан.

Пример

Рассмотрим элемент управления Label и элемент управления Slider, которые связаны между собой формулой:

Label1.Text = 1/Slider1.Value

Элементы управления label и slider связаны формулой Label1.Text = 1/Slider1.Value.

Значение slider по умолчанию равно 50. Если значение slider становится 0, Label1 не покажет никакого значения, и будет показан баннер ошибки:

Значение элемента управления slider становится 0, что приводит к ошибке деления на ноль и баннеру ошибки.

Давайте посмотрим на то, что произошло, подробнее:

  1. Пользователь переместил ползунок влево и свойство Slide1.Value изменилось на 0.
  2. Label1.Text автоматически пересчитывается. Произошло деление на ноль, что привело к ошибке.
  3. В этой формуле нет IfError. Ошибка деления на ноль возвращается вычислением формулы.
  4. Label1.Text ничего не может показать для этой ошибки, поэтому он показывает пустое состояние.
  5. Вызывается OnError. Поскольку обработчик отсутствует, отображается стандартный баннер ошибки с информацией об ошибке.

При необходимости можно также изменить формулу Label1.Text = IfError( 1/Slider1.Value, 0 )на . Использование IfError означает, что не существует баннера об ошибке или ошибке. Невозможно изменить значение ошибки из OnError , так как ошибка уже произошла— OnError определяет, как сообщается.

Если вы добавите обработчик OnError , он не влияет на шаги до шага 5, но он изменяет способ сообщения об ошибке:

Trace( $"Error {FirstError.Message} in {FirstError.Source}" )

Формула App.OnError настроена для создания трассировки.

При использовании этого обработчика OnError пользователь приложения не видит никаких ошибок. Но эта ошибка добавляется в трассировку монитора, включая источник сведений об ошибке из FirstError:

Значение элемента управления slider становится 0, что приводит к ошибке деления на ноль, но баннера ошибки нет.

Если вы также хотите отобразить баннер ошибок по умолчанию вместе с трассировкой, повторно запустите ошибку с функцией Error после вызова трассировки , как если бы трассировка не была:

Trace( $"Error {FirstError.Message} in {FirstError.Source}" );
Error( FirstError )

Свойство OnStart

Заметка

Использование свойства OnStart может вызвать проблемы с производительностью при загрузке приложения. Мы создадим альтернативные варианты для использования этого свойства — кэширования данных и настройки глобальных переменных. Существует уже альтернатива для определения первого экрана для отображения с помощью Навигации. В зависимости от контекста это свойство может быть отключено по умолчанию. Если вы не видите его и не хотите использовать его, проверьте дополнительные параметры приложения, чтобы включить его. Вы также можете использовать свойство OnVisible экрана. По умолчанию при включении правила OnStart для неблокировки функция OnStart позволяет выполнять функцию OnStart одновременно с другими правилами приложения. Таким образом, если переменные, на которые ссылаются другие правила приложения, инициализированы в функции OnStart , они могут быть еще не полностью инициализированы. Кроме того, экран может отображаться и становиться интерактивным до завершения работы функций Screen.OnVisible или App.OnStart , особенно если они занимают много времени.

Свойство OnStart запускается, когда пользователь запускает приложение. Это свойство часто используется для:

  • Получение и кэширование данных в коллекциях с помощью функции "Сбор ".
  • Настройка глобальных переменных с помощью функции Set.

Эта формула выполняется до появления первого экрана. Никакой экран не загружен, поэтому вы не можете установить переменные контекста с помощью функции UpdateContext. Но можно передать переменные контекста с помощью функции Навигации .

После изменения свойства OnStart проверьте его, наведите указатель мыши на объект App в области представления "Дерево ", выбрав многоточие (...), а затем нажмите кнопку Run OnStart. В отличие от того, когда приложение загружается в первый раз, существующие коллекции и переменные уже заданы. Чтобы начать с пустых коллекций, используйте функцию ClearCollect вместо функции Collect.

Контекстное меню элемента приложения для запуска OnStart

Заметка

  • Использование функции Навигации в свойстве OnStart прекращено. Существующие приложения по-прежнему работают. В течение ограниченного времени его можно включить в параметрах приложения (в разделе " Отставлено"). Но использование Navigate таким образом может привести к задержкам загрузки приложения, так как система завершит работу OnStart перед отображением первого экрана. Вместо этого используйте свойство StartScreen , чтобы задать первый экран.
  • Снятый параметр отключен для приложений, созданных до марта 2021 г., где вы добавили переход к OnStart в период с марта 2021 г. и сейчас. При редактировании этих приложений в Power Apps Studio вы увидите ошибку. Включите устаревший переключатель, чтобы сбросить эту ошибку.

Свойство StartScreen

Свойство StartScreen задает, на каком экране отображается первый экран. Он вычисляется один раз, когда приложение загружает и возвращает объект экрана для отображения. По умолчанию это свойство пусто, а первый экран в представлении дерева Студии отображается сначала.

StartScreen — это свойство потока данных, которое не может содержать функции поведения. Доступны все функции потока данных. Используйте эти функции и сигналы, чтобы решить, какой экран будет отображаться сначала:

  • Функция Param для чтения параметров, используемых для запуска приложения.
  • Функция User для чтения информации о текущем пользователе.
  • Функции LookUp, Filter, CountRows, Max и другие функции, считывающие из источника данных.
  • Вызовы API через соединитель. Убедитесь, что вызов возвращается быстро.
  • Такие сигналы, как Подключение, Компас и Приложение.

Заметка

Глобальные переменные и коллекции, включая созданные в OnStart, недоступны в StartScreen. Доступны именованные формулы, которые часто являются лучшей альтернативой для повторного использования формул в приложении.

Если StartScreen возвращает ошибку, первый экран в представлении дерева Студии отображается так, как если бы не задан начальный экран . Используйте функцию IfError для перехвата ошибок и перенаправления на экран ошибки.

После изменения начального экрана в Студии проверьте его, наведите указатель мыши на объект приложения в области представления "Дерево", выбрав многоточие (...), а затем нажмите кнопку "Перейти к начальной экран". Экран изменяется, как если бы приложение только что загружено.

Перейти к StartScreen

Примеры

Screen9

Screen9 сначала отображается при запуске приложения.

If( Param( "admin-mode" ) = 1, HomeScreen, AdminScreen )

Проверяет, задан ли параметр "режим администрирования" и использует его для выбора того, отображается ли экран homeScreen или AdminScreen.

If( LookUp( Attendees, User = User().Email ).Staff, StaffPortal, HomeScreen )

Проверяет, является ли участник сотрудником и направляет их на правильный экран при запуске.

IfError( If( CustomConnector.APICall() = "Forest", 
             ForestScreen, 
             OceanScreen 
         ), 
         ErrorScreen 
)

Направляет приложение на основе вызова API в ForestScreen или OceanScreen. Если API завершается ошибкой, приложение использует ErrorScreen вместо этого.

Свойство StudioVersion

Используйте свойство StudioVersion для отображения или записи версии Power Apps Studio, используемой для публикации приложения. Это свойство помогает при отладке и проверке повторной публикации приложения с помощью последней версии Power Apps Studio.

StudioVersion возвращает текст. Формат этого текста может меняться со временем, поэтому рассматривать его как целое и не извлекать отдельные части.