Hello, alier!

まずはオーソドックスに、画面に「Hello」を表示する所から始めましょう。

ただ、テキストを表示するだけではシンプルすぎるので、画面上にボタンを設置し、押したら「Hello, alier!」と表示するアプリケーションにします。

Starting Guideのセットアップの手順の中で、すでに「Hello, alier!」の表示に成功した方は、サンプルコードで何が行われていたかの解説にもなります。

info

Learn Alier で行う解説はモバイル版のソースコードを元にしています。

事前準備

コードを書く前の準備として、Starting Guideの以下の手順まで済んでいることを前提にして進めていきます。

ソースコード

一旦ソースコード全体を見てみましょう。その後細かくコードを確認して行きます。


  • /app_res/main.js
Object.assign(globalThis, await Alier.import("/alier_sys/AlierFramework.js"));

async function main() {
    setupAlier();

    Alier.View.attach(new Hello());
}

class Hello extends ViewLogic {
    constructor() {
        super();

        // container
        const container = `
          <alier-container>
            <input type="button" id="button" value="ボタン" data-ui-component data-active-events="click"/>
            <div id="comment" data-ui-component></div>
          </alier-container>
        `;

        // load html
        this.relateElements(
            this.collectElements(
                this.loadContainer({ text: container })
            )
        );
    }

    async messageHandler(msg) {
        return await msg.deliver({
            button: msg => {
                // commentにhello alierを挿入する
                this.comment.innerText = "Hello, alier!"
            }
        });
    }
}

以下は実行結果です。

起動画面

ボタン押下前

ボタン押下後

ボタン押下後

解説

フレームワークのインポート

main.js の最初の行から見ていきましょう。

Object.assign(globalThis, await Alier.import("/alier_sys/AlierFramework.js"));

AlierFramework.jsAlier.import() でインポートしています。これによって ViewLogic などの Alier の主要なクラスやオブジェクトがプログラム全体で利用可能になります。


エントリーポイント

async function main() {

main() 関数を作成しています。

Alier フレームワークでは main() がエントリーポイントとなるので必ず作成する必要があります。

アプリケーションはこの関数から始まります。


    setupAlier(); 

その次の setupAlier() で、フレームワーク機能をプログラム内で使えるようにセットアップします。特別な理由がない限りは、呼ぶようにして下さい。


    Alier.View.attach(new Hello()); 

一番初めに表示されるコンテンツを生成し、画面に設置しています。Alier.View は Alier のルートエレメントのことで、デバイス画面に表示されるアプリケーションの画面そのものです。引数に渡している Hello() は表示するコンテンツで、詳しくはこの後説明します。Alier.View は最初、上映前のスクリーンのように何も映し出していない状態ですが、attach() を行うことで引数に渡したコンテンツが Alier.View に反映、表示されます。

通常はここに、データを扱うための Model の処理が加わりますが、今回のサンプルは表示処理だけを扱うので割愛しています。


コンテナの構築と ViewLogic の初期化

class Hello extends ViewLogic {
    constructor() {
        super();

ViewLogic クラスを継承した Hello という派生クラスを定義します。このクラスのインスタンスを attach() に渡しています。

ViewLogic は Alier の表示機能の中核を担うクラスで、コンテンツを管理するための容器のようなものです。このような役割からコンテナと呼ばれています。

ViewLogic は、コンテナに入っている要素を管理し、様々な操作を加える事が出来ます。


        // container
        const container = `
          <alier-container>
            <input type="button" id="button" data-ui-component data-active-events="click">ボタン</input>
            <div id="comment" data-ui-component></div>
          </alier-container>
        `;

表示コンテンツを HTML で記述し、変数に文字列として格納しています。

<alier-container> と、タグの中に記述された data-ui-component 属性と data-active-events 属性は Alier 独自のタグと属性になります。これらについてはこの後の処理で説明します。


        // load html
        this.relateElements(
            this.collectElements(
                this.loadContainer({ text: container })
            )
        );

ViewLogic に 先ほど用意した HTML を読み込みます。

loadContainer() で、引数で渡された HTML 文字列をパースし、<alier-container> タグで囲われた要素をDOMノードに変換して、これをコンテナとして内部に保存します。またこのコンテナは返値となります。

collectElements() で引数で渡されたコンテナの中からdata-ui-component 属性と id 属性を持つ要素を抽出し、その一覧情報を返します。

relateElements() で抽出された一覧情報を元に要素を ViewLogic のプロパティに割り当てて、自身のメンバー変数として参照することを可能にします。

また、この割り当てられた要素の中で data-active-events 属性が付与されたものはイベントを受け取ることが出来るようになります。

今回は短い HTML なので内部変数で記述しましたが、もっと複雑な画面を構成する時は HTML ファイルを作成し、そのファイルを読み込む事も出来ます。


ボタンイベントをハンドリングする

ボタンを押した時のイベントをハンドリングしてみましょう。

    async messageHandler(msg) {
        return await msg.deliver({
            button: msg => {

基底クラスの ViewLogicmessageHandler()コールバック関数をオーバーライドすることで ViewLogic に送られたメッセージを受ける事が出来ます。

data-active-events 属性の付いた要素のイベントが messageHandler()にメッセージオブジェクトに変換され ViewLogic に送られます。

HTML 要素からのイベントでは id 属性の値がメッセージオブジェクトの id プロパティ に設定されます。ここでは "button"です。

messageHandler()の引数で渡される msg はメッセージオブジェクトです。このオブジェクトにはイベント内容や発生した要素の情報が入っています。メッセージオブジェクトの deliver メソッドを使用すると、メッセージ処理を行うことが出来ます。メッセージの id と対になった関数の連想配列を deliver に渡すことで、deliver がその id に対応する処理を呼び出します。

この仕組みによって、そのメッセージに対応する処理を簡潔に記述することが出来ます。


テキスト表示

最後に「Hello, alier!」を画面に表示してみましょう。

    this.comment.innerText = "Hello, alier!"

HTML 要素を作成する時に記述した id 属性がプロパティ名になります。このプロパティから HTML エレメントを参照出来るので、HTML 操作と同様の事が行えます。

今回はテキスト表示用ブロック要素の comment を参照して、innerText を「Hello, alier!」に変更します。


実行結果

それではサンプルを動かしてみましょう。

ボタンを押下して「Hello, alier!」が表示されるのを確認できたでしょうか。

Hello, alier!