JavaScriptの処理やアニメーションは非同期的に動作するため、Onsen UIは同期的に(狙ったタイミングで)特定の処理を実行できるようにons-page
のライフサイクルを提供しています。ページのライフサイクルを使うと、データの事前読み込み、ビューの更新、ページの破棄の前のデータ保存などができます。
<ons-page>
はライフサイクルの中の決まったタイミングでいくつかのDOMイベントを発火します。各ページの振る舞い(behavior)を調整したい場合にはこれらのイベントを使用します。
init
イベントは<ons-page>
がDOMにアタッチされると発火します。ページが作成されてから表示されるまでの間に、何らかの初期化処理を実行したり、ページに動的な内容を追加したりしたい場合にはこのイベントを使ってください。destroy
イベントは<ons-page>
がDOMからデアタッチされる直前に、ページが破棄される際に発火します。状態をクリーンアップしたりデータを保存したりしたい場合にはこのイベントを使ってください。show
イベントは<ons-page>
が画面に現れるたびに発火します。例えば新しいページが作成されて表示されたり、既存のページが再び表示されたりした場合に発火します。ページが表示された際に毎回行いたい処理がある場合にはこのイベントを使ってください。hide
イベントは<ons-page>
が画面から隠れた場合に発火します。例えば画面に表示中のページが破棄されたり、ページスタックには残っているが画面からページが隠れてしまったりした場合に発火します。ページが隠れるたびに毎回行いたい処理がある場合にはこのイベントを使ってください。ページライフサイクルイベントは子孫ページに伝播し、子孫ページは連鎖的にshow
、hide
、destroy
されます。例えば<ons-navigator>
を破棄すると、画面に表示中のページ(ナビゲーターの最上位のページ)にhide
イベントが発火し、ナビゲーターのページスタックの全ページにdestroy
イベントが発火します。
ライフサイクルイベントは通常のDOMイベントであり、バブリング(bubbling)するので、documentや任意の親要素にリスナーを追加することでイベントを捕捉することができます。その際、イベントオブジェクトには、ページへの参照がevent.target
に格納されます。
<ons-page id="page1">空ページ</ons-page>
<script>
document.addEventListener('init', function(event) {
if (event.target.matches('#page1')) {
ons.notification.alert('ページ1が初期化されました');
// コンテンツを準備...
}
}, false);
</script>
v2.4.0 からの<template>
要素のサポートにより、ライフサイクルイベントに加えてライフサイクルフックが使えるようになりました。フックは対応するイベントと同じタイミングで実行されます:
<template id="page1.html">
<ons-page>
<ons-toolbar>
<div class="center"></div>
</ons-toolbar>
<!-- 追加コンテンツ -->
<script>
ons.getScriptPage().onInit = function() {
// ページのコンテンツやその他の内容を準備
this.querySelector('ons-toolbar .center').innerHTML = 'Title';
this.onShow = function() { ... };
this.onHide = function() { ... };
this.onDestroy = function() { ... };
};
</script>
</ons-page>
</template>
ここで、テンプレート(ons-page
)直下のノードは1つである必要があることに注意してください。また、オプション機能として、<template>
要素には<script></script>
タグを入れることができます。<template>
要素に<script></script>
タグを入れると、テンプレートが作成されてDOMにアタッチされたタイミングでスクリプトが実行されます。
スクリプトはグローバルスコープ内で評価されるため、書く内容によってはアプリの他の部分に影響する可能性があります。例えば、スクリプト内で変数を宣言すると、グローバルスコープが汚染されます。これを防ぐには、変数宣言をクロージャでラップする必要があります。
上述のサンプルコードのように、ons.getScriptPage()
メソッドを使うと、<script></script>
タグの親の位置にある、DOMにアタッチされたばかりのons-page
を取得することができます。このメソッドはテンプレート内でのみ使える(ons-page
の子の中で、かつscript
タグの中で呼ぶ必要がある)ことに注意してください。また、`onsenui@2.5.2で初めて追加されたメソッドであることにも注意してください。このメソッドを使わない場合は、classやidを指定して直接
ons-page`を取得する必要があります。
イベントを使うかフックを使うかは自由です。イベントはビューとロジックを分離できるメリットがあり、フックはコードが短くなるメリットがあります。