【PowerApps】OnStartやOnEditなどのプロパティの実行順序と注意点について
背景
PowerApps でSharepointリストのフォームをカスタマイズする際、フォーム実行時に変数を定義、初期化したりマスタからデータを取得したりといった処理を行えるプロパティがいくつかあります。(OnStartやOnVisibleなど)
ここではそれらのプロパティの実行順序と、各プロパティで行う処理の注意点について記載していきます。
各プロパティの実行順序
プロパティOnStart、OnVisible、OnNew~各種の実行順序を調べるため、各プロパティで文字列変数にプロパティ名を結合する処理を設定し、その文字列変数を下記画像のようにラベルに表示しました。
結果として、下記のような実行順序となりました。
OnStart > [OnVisible、OnNew、OnVisible、OnEdit]
どのプロパティよりも先にOnStartが実行されるようでした。
OnVisibleと[OnNew~各種]は実行順序がまちまちで、特にどちらが先に実行されるか決まっていないようでした。
各プロパティの特徴、注意点等を記載していきます。
OnStart
Appコントロールのプロパティで、アプリが実行されて一番最初に実行されます。
グローバル変数の宣言や、データソースからデータを取得してコレクションに格納するなど、アプリの中で使用するデータや変数の用意をする処理を行うのによいと思います。
Sharepointリストのフォームをカスタマイズしている場合(SharePointIntegrationコントロールが存在する)の注意点として、フォームを最初に開いた時はOnStartは実行されますが、一度フォームを閉じて再度フォームを開いた時にはOnStartが実行されない、という点が挙げられるかと思います。この動きについて下記解説します。
下図のようにリストアイテムのフォームを開きます。
フォーム外をクリックしてフォームを閉じます。
今開いていたのと別のアイテムのフォームを開きます。
このような動作をした場合、OnStartは最初にフォームを開いたときにしか実行されず、データがキャッシュされます。
ブラウザを更新後に再度アイテムのフォームを開いた際にはOnStartが実行されます。
このことから、OnStartではグローバル変数の宣言や、キャッシュされることでパフォーマンスが良くなるような大きなデータを読み込む処理を行うことがよさそうです。
※2022/11/30現在Microsoftの公式ドキュメントではOnStartの使用は推奨されておらず、代わりにStartScreen プロパティに初期表示するスクリーンを指定し、スクリーンのOnVisibleで処理をすることを勧めているようです。
OnVisible
OnVisibleはスクリーンコントロールのプロパティで、スクリーンが表示された時に実行されます。スクリーン上でしか参照できないローカル変数の宣言(UpdateContext)が行えます。
アプリで一番最初に表示されるスクリーンのOnVisibleはOnStartと同様に、最初にフォームを開いたときにしか実行されません。
OnNew、OnVisible、OnEdit
SharePointIntegrationコントロールのプロパティで、それぞれフォームを新規、表示、編集モードで開いた際に実行されます。
SharePointIntegrationコントロールはSharepointリストの「フォームのカスタマイズ」からPowerAppsアプリを作成した際に追加されるコントロールです。
これらのプロパティでは、フォームを開くたびに必ず実行されてほしい処理を書くのが良いかと思います。(アイテムの列値を使った判定処理など)
OnNew~各種のプロパティでの注意点としては、OnStartでデータソースから取り込んだデータを使って判定処理などをすると、データがまだ取り込み中に判定をしてしまい、思っていない動作になる場合があることです。下記で解説します。
OnStartで家計簿マスタからデータをフィルターして取り込み、masterData1コレクションに格納します。
OnEditでmasterData1が空かどうかを判定し、空じゃない場合は
文字列"masterDataComleted"をProcessVal変数に結合します。
実際にフォームを初回実行(データがキャッシュされていない状態)すると、masterData1が空の判定となり、ProcessVal変数に追加されません。
※下図の赤い囲みはProcessVal変数の値で、OnStart→OnVisible→OnEditの順に実行されたことを表しています。
フォームを一度閉じ、再度フォームを開くとProcessVal変数に文字列"masterDataComleted"が追加されており、masterData1が正しく取り込まれた後にOnEditで判定処理が行われたことが分かります。
このように、OnStartで取り込んだデータをOnEditやOnViewなどで判定処理に使用すると、想定していない動作となる場合があるので注意が必要です。
パフォーマンスは多少落ちますが、今回で言うとOnEditの中でmasterData1を取り込むなどの回避策が考えられます。
おわりに
プロパティでの実行順序について自分なりにまとめてみました。
認識が間違っている点などございましたら是非ご指摘頂けますと幸いです。
今回の記事は2022/11/30現在の情報です。