6 Oracle JETのユーザー・インタフェースの基礎の理解

Oracle JETユーザー・インタフェース(UI)コンポーネントでは、htmlElementプロトタイプが拡張され、World Wide Web Consortium (W3C)のカスタム要素に関するWebコンポーネント仕様が実装されています。カスタム要素を使用すると、Oracle JETコンポーネントをより宣言的な方法で操作し、DOMレイヤーで直接プロパティとメソッドにアクセスできるようになります。

Oracle JETのユーザー・インタフェースについて

Oracle JETには、アプリケーションで使用するコンポーネント、パターンおよびユーティリティが含まれています。また、このツールキットにはAPI仕様(該当する場合)およびOracle JETクックブックの1つ以上のコード例も含まれています。

Oracle JETのUIコンポーネント、パターンおよびユーティリティの識別

Oracle JETクックブックには、使用可能なコンポーネント、デザイン・パターンおよびユーティリティがすべてリストされています。デフォルトでは、クックブックは機能セクションに分かれていますが、「Sort」をクリックして、コンテンツをアルファベット順に並べ替えることもできます。

クックブックに含まれているサンプルは、オンラインで編集して変更の効果を即座に確認できます。また、APIドキュメントのリンクもあります(該当する場合)。

Oracle JETコンポーネントの共通機能について

すべてのOracle JETコンポーネントはカスタムHTML要素として実装されているため、これらのコンポーネントにプログラムによってアクセスすることは、HTML要素と対話することと似ています。

カスタム要素の構造

Oracle JETカスタム要素名はoj-、またはより新しいCore Packコンポーネントの場合はoj-c-で始まり、その他のHTML要素を追加する場合と同じ方法でページに追加できます。次の例では、oj-labelおよびoj-input-date-timeカスタム要素が、標準のHTML div要素に子要素として追加されています。

<div id="div1">
  <oj-label for="dateTime">Default</oj-label>
  <oj-input-date-time id="dateTime" value='{{value}}'>
  </oj-input-date-time>
</div>

各カスタム要素には、次のうち1つ以上を含めることができます。

  • 属性: 要素の機能に影響を与える修飾子です。

    文字列リテラルは解析され、プロパティ・タイプに強制変換されます。Oracle JETでは、ブール、数値、文字列、オブジェクト、配列および任意の文字列リテラル型の強制がサポートされています。任意型は、要素で使用される場合、要素のAPIドキュメント内でアスタリスク(*)を使用してマークされ、オブジェクト、配列または文字列に強制変換されます。

    上で定義されているoj-input-date-time要素において、valueは日付オブジェクトを含む属性です。これは、属性の値が更新された場合に要素のViewModelを更新する必要があるかどうかを示すバインディング式を使用して定義されています。

    <oj-input-date-time id="dateTime" value='{{value}}'>
    

    {{...}}構文は、要素のvalueプロパティが変更された場合に、要素のViewModel内で更新されることを示します。属性の値によって対応するViewModelが更新されないようにするには、[[...]]構文を使用します。

  • メソッド: サポートされているメソッド

    各カスタム要素のサポートされているメソッドは、そのAPIに記述されています。

  • イベント: サポートされているイベント

    カスタム要素に固有のイベントは、そのAPIに記述されています。要素のViewModelでリスナーのメソッドを定義します。

    var listener = function( event )
    {
      // Check if this is the end of "inline-open" animation for inline message
      if (event.detail.action == "inline-open") {
        // Add any processing here
      }
    };

    カスタム要素のDOM属性、JavaScriptプロパティまたはaddEventListener()を使用して、リスナーを参照します。

    • DOM属性を使用します。

      on-event-name構文を使用して、カスタム要素でリスナーを宣言します。
      <oj-input-date-time on-oj-animate-start='[[listener]]'</oj-input-date-time>

      この例では、リスナーの値が変更されることを予期していないため、リスナーが[[...]]構文を使用して宣言されていることに注意してください。

    • JavaScriptプロパティを使用します。

      .onEventNameプロパティにViewModelのリスナーを指定します。

      myInputDateTime.onOjAnimateEnd = listener

      JavaScriptプロパティでonOjAnimateEndプロパティにcamelCaseが使用されていることに注意してください。camelCasedのプロパティは、たとえば、on-oj-animate-endのように、大文字の前にダッシュを挿入してその文字を小文字に変換することによって、属性名にマップされます。

    • addEventListener() APIを使用します。

      myInputDateTime.addEventListener('ojAnimateEnd', listener);

    デフォルトでは、valueChangedなどのプロパティが更新されるたびに、JETコンポーネントでpropertyChangedカスタム・イベントも起動されます。前述の3つの方法のいずれかを使用して、リスナーを定義および追加できます。propertyChangedイベントを宣言的に参照する場合は、on-property-changed構文を使用します。

    <oj-input-date-time value="{{currentValue}}" on-value-changed="{{valueChangedListener}}" </oj-input-date-time>
  • スロット

    Oracle JET要素には、要素内でのコンテンツの配置を決定する2つのタイプの子コンテンツを含めることができます。

    • サポートされているslot属性を含むすべての子要素は、該当する名前付きスロットに移動されます。サポートされているすべての名前付きスロットは、要素のAPIに記述されています。サポートされていない名前付きスロットを含む子要素は、DOMから削除されます。

      <oj-table>
        <div slot='bottom'<oj-paging-control></oj-paging-control></div>
      </oj-table>
    • slot属性がないすべての子要素は、通常の子とも呼ばれるデフォルトのスロットに移動されます。

カスタム要素は、そのモジュールがアプリケーションによってロードされた後にのみ認識されます。要素が認識されると、Oracle JETではその要素のビジー状態が登録され、標準要素からカスタム要素に要素をアップグレードするプロセスが開始されます。アップグレード・プロセスが完了するまで、要素を対話に使用することはできません。アプリケーションでJETカスタム要素を操作する前に、ページレベルまたは要素が範囲のBusyContextをリスニングする必要があります。ただし、(プロパティの取得ではなく)プロパティの設定が可能なのはBusyContextが初期化される前です。ビジー・コンテキストの範囲指定方法については、 BusyContext APIドキュメントを参照してください。

カスタム要素のアップグレードは、データ・バインディングを管理するバインディング・プロバイダに依存します。バインディング・プロバイダで属性式を設定および更新する必要があります。その管理対象サブツリー内のすべてのカスタム要素のアップグレードは、プロバイダによって該当のサブツリーにバインディングが適用されるまで完了しません。デフォルトでは、ページの場合にはバインディング・プロバイダは1つですが、サブツリー固有のバインディング・プロバイダは、data-oj-binding-provider属性に値noneおよびknockoutを指定して使用することで追加できます。デフォルト・バインディング・プロバイダはknockoutですが、ページまたはDOMのサブツリーで式構文またはknockoutを使用しない場合、アプリケーションで要素にdata-oj-binding-provider=”none"を設定し、依存するJETカスタム要素でバインディングが適用されてアップグレードが終了するのを待機しないようにすることができます。

その他の共通機能

Oracle JETカスタム要素にも、次の共通機能があります。

  • コンテキスト・メニュー

    カスタム要素では、各要素のAPIドキュメントに説明されている、Oracle JETカスタム要素にコンテキスト・メニューを追加するslot属性がサポートされています。

    <oj-some-element>
      <-- use the contextMenu slot to designate this as the context menu for this component -->
      <oj-menu slot="contextMenu" style="display:none" aria-label="Some element's context menu"
        ...
      </oj-menu>
    </oj-some-element>
  • キーボード・ナビゲーションおよびその他のアクセシビリティ機能

    キーボード・ナビゲーションをサポートするOracle JETコンポーネントには、そのAPIドキュメントにエンド・ユーザー情報がリストされています。Oracle JETおよびアクセシビリティの詳細は、「アクセシブルなOracle JETアプリケーションの開発」を参照してください。

  • ドラッグ・アンド・ドロップ

    Oracle JETは、標準HTML5のドラッグ・アンド・ドロップのサポートが含まれており、HTML5のドラッグ・アンド・ドロップ動作を、サポートされているモバイルおよびデスクトップ・ブラウザに拡張するために、dnd-polyfillライブラリが用意されています。さらに、oj-tableなどの一部のOracle JETカスタム要素では、dnd属性を介してドラッグ・アンド・ドロップ動作がサポートされています。特定の詳細は、コンポーネントのAPIドキュメントおよびクックブックの例を参照してください。HTML5のドラッグ・アンド・ドロップについてさらに学習するには、http://www.w3schools.com/html/html5_draganddrop.aspを参照してください。

  • 遅延レンダリング

    多くのOracle JETカスタム要素では、コンテンツが表示されるまでoj-deferを使用してレンダリングを遅延する機能がサポートされています。oj-deferを使用するには、カスタム要素の周囲でラップします。

    <oj-collapsible id="defer">
      <h4 id="hd" slot="header">Deferred Content</h4>
        <oj-defer>
          <oj-module config='[[deferredRendering/content]]'>
          </oj-module>
        </oj-defer>
    </oj-collapsible>
    

    oj-module定義の指定に従って、遅延コンテンツをアプリケーションのビューおよびViewModel (content.htmlおよびcontent.js)に追加します。完全なコード例は、折りたたみ-レンダリングの遅延を参照してください。

    oj deferをサポートするカスタム要素のリストは、 oj-deferを参照してください。

カスタム要素の例および参照

Oracle JETクックブックおよび『Oracle® JavaScript Extension Toolkit (Oracle JET) APIリファレンス』には、カスタム要素の使用方法を示す例があります。さらに、クックブックには、サンプルをダウンロードせずにサンプル・コードを直接変更し、結果を表示できる編集機能のデモがあります。

カスタム要素のWorld Wide Web Consortium (W3C) Webコンポーネント仕様についてさらに学習するには、Custom Elementsを参照してください。

Oracle JETの予約済ネームスペースおよび接頭辞について

Oracle JETでは、リリース14.0.0でOracle JET Core Packコンポーネントの導入を事前設定した元のUIコンポーネントのセットに対して、ojネームスペースおよび接頭辞が予約されています。コンポーネント名、ネームスペース、擬似セレクタ、パブリック・イベント接頭辞、CSSスタイル、Knockoutバインディング・キーなどが含まれますが、これらに限定されません。Oracle JETでは、新しいCore Packコンポーネントのoj-cネームスペースも予約されています。

バインディングおよび制御フローについて

Oracle JETには、Knockoutを使用してアプリケーション内のページに動的要素を簡単にバインドするためのコンポーネントと式が含まれています。

oj-bind-textを使用したテキスト・ノードのバインド

Oracle JETは、oj-bind-text要素の使用とojknockoutモジュールのインポートにより、テキスト・ノードの変数へのバインディングをサポートします。

oj-bind-text要素は、バインディングが適用された後、DOMから削除されます。たとえば、次のコード・サンプルは、oj-input-textoj-buttonの両方でテキスト・ノードがbuttonLabel変数にバインドされている例を示しています。入力テキストが更新されると、ボタン・テキストも自動的に更新されます。

<div id='button-container'>
   <oj-button id='button1'>
      <span><oj-bind-text value="[[buttonLabel]]"></oj-bind-text></span>
   </oj-button>
   <br><br>
   <oj-label for="text-input">Update Button Label:</oj-label>
   <oj-input-text id="text-input" value="{{buttonLabel}}"></oj-input-text>
</div>

次に、この例のviewModelを作成するためのスクリプトを示します。

import * as ko from "knockout";
import "ojs/ojinputtext";
import "ojs/ojlabel";
import "ojs/ojbutton";

class ButtonModel {
  buttonLabel: ko.Observable<string>;

  constructor() {
    this.buttonLabel = ko.observable("My Button");
  }
}

export = ButtonModel;
define(["knockout", "ojs/ojknockout", "ojs/ojbutton",
                       "ojs/ojinputtext", "ojs/ojlabel"], 

  function (ko) {

    function ButtonModel() {
      this.buttonLabel = ko.observable("My Button");
    }

    return ButtonModel;

  });

次の図は、サンプル・コードの出力を示しています。

このイメージには2つのセクションがあり、それぞれにボタンと「Update Button Label」というラベルのoj-input-textがあります。最初のセクションでは、ボタンとテキスト・ボックスの両方に「My Button」というテキストが含まれています。2番目のセクションでは、両方に「Click Me!」というテキストが含まれています。

Oracle JETクックブックには、この項で使用されている完全な例があります。テキスト・バインディングに関する項を参照してください。

HTML属性のバインド

Oracle JETは、属性名に":"という接頭辞を付けることとojknockoutモジュールをインポートすることにより、任意のHTML要素の属性に対する一方向属性データ・バインディングをサポートします。

HTMLまたはJET要素内のHTML属性を使用するには、接頭辞としてコロンを付けます。JETコンポーネント固有の属性には接頭辞は必要ありません。

次のコード・サンプルは、接頭辞がある構文と接頭辞がない構文の両方を使用した、2つのJET要素と2つのHTML要素を示しています。ラベルおよび入力要素はネイティブなHTML要素であるため、それらのデータがバインドされたすべての属性に接頭辞としてコロンを付ける必要があります。oj-labeloj-input-text要素は、ネイティブなHTML要素属性についてのみ接頭辞を使用し、コンポーネント固有の属性には接頭辞なしの構文を使用します。

<div id="demo-container">
  <oj-label for="[[inputId1]]">oj-input-text element</oj-label>
  <oj-input-text :id="[[inputId1]]" value="{{value}}"></oj-input-text>
  <br><br>
  <label :for="[[inputId2]]">HTML input element</label>
  <br>
  <input :id="[[inputId2]]" :value="[[value]]" style="width:100%;max-width:18em"/>
</div>

次に、この例のviewModelを作成するためのスクリプトを示します。

import * as ko from "knockout";
import "ojs/ojinputtext";
import "ojs/ojlabel";
import 'ojs/ojknockout';

class ViewModel {
  inputId1: ko.Observable<string>;
  inputId2: ko.Observable<string>;
  value: ko.Observable<string>;

  constructor() {
    this.inputId1 = ko.observable("text-input1");
    this.inputId2 = ko.observable("text-input2");
    this.value = ko.observable("This text value is bound.");
  }
}

export = ViewModel;
define(["knockout", "ojs/ojknockout", "ojs/ojinputtext", "ojs/ojlabel"], 

  function (ko) {

    function ViewModel() {
      this.inputId1 = ko.observable("text-input1");
      this.inputId2 = ko.observable("text-input2");
      this.value = ko.observable("This text value is bound.");
    }

    return ViewModel;

  });

次の図は、サンプル・コードの出力を示しています。この図には、oj-input-text要素とHTML入力要素の2つのテキスト・ボックスが表示されています。どちらのテキスト・ボックスにも、要素を示すラベルと、「This text value is bound.」という値が表示されています。

Oracle JETクックブックには、この項で使用されている完全な例があります。属性バインディングに関する項を参照してください。

oj-bind-ifを使用した条件の処理

Oracle JETは、oj-bind-if要素の使用とojknockoutモジュールのインポートにより、要素の条件付きレンダリングをサポートします。

oj-bind-if要素は、バインディングが適用された後でDOMから削除されます。スロッティングに使用する場合はdivなどの別の要素でラップする必要があります。slot属性はoj-bind-ifでサポートされていないため、ラッパーに適用する必要があります。たとえば、次のコード・サンプルは、oj-buttonsetで選択されたオプションに基づいて、条件付きでレンダリングされるイメージを示しています。

<div id="demo-container">
<oj-buttonset-one class="oj-buttonset-width-auto" value="{{buttonValue}}">
  <oj-option id="onOption" value="on">On</oj-option>
  <oj-option id="offOption" value="off">Off</oj-option>
</oj-buttonset-one>
<br><br>
<div>Image will be rendered if the button is on:</div>
<oj-bind-if test="[[buttonValue() === 'on']]">
  <oj-avatar role="img" aria-label="Avatar of Amy Bartlet" size="md" initials="AB"
	src="../css/images/avatar-image.jpg" class="oj-avatar-image"></oj-avatar>
</oj-bind-if>
</div>

上の例では、oj-avatar要素は、カスタムまたはプレースホルダ・イメージを表示できるアイコンです。oj-avatarに関する項を参照してください。

次に、この例のビュー・モデルを作成するためのスクリプトを示します。

import * as ko from "knockout";
import "ojs/ojknockout";
import "ojs/ojbutton";
import "ojs/ojavatar";

class ViewModel {
  buttonValue = ko.observable("off");
}
export = ViewModel;
define(['knockout', 'ojs/ojknockout', 'ojs/ojbutton', 'ojs/ojavatar'],
  function (ko) {
    function ViewModel() {
      this.buttonValue = ko.observable("off");
    }
    return ViewModel;
  }
);

次の図は、サンプル・コードの出力を示しています。oj-buttonsetが'on'に設定されている場合、oj-avatar要素がレンダリングされて表示されます。

Oracle JETクックブックには、この項で使用されている完全な例があります。Ifバインディングに関する項を参照してください。

oj-bind-for-eachを使用したループ命令の処理

Oracle JETは、oj-bind-for-each要素の使用とojknockoutモジュールのインポートにより、配列のアイテムのバインディングなどのループ命令の処理をサポートします。

oj-bind-for-each要素は、単一のtemplate要素をその直接の子としてのみ受け入れます。liタグなどの繰り返されるマークアップは、すべてtemplateタグの内部に配置する必要があります。たとえば、次のコード・サンプルは、順序なしリストの中にネストされた別の順序なしリストを示しています。リスト・アイテムは、ネストされたoj-bind-for-each要素内のoj-bind-textタグを使用して作成されます。

<div id="form-container">
  <ul>
    <oj-bind-for-each data="[[categories]]">
      <template data-oj-as="category">
        <li>
          <ul>
            <oj-bind-for-each data="[[category.data.items]]">
              <template data-oj-as="item">
                <li>
                  <oj-bind-text value="[[category.data.name + ' : ' + item.data]]"></oj-bind-text>
                </li>
              </template>
            </oj-bind-for-each>
          </ul>
        </li>
      </template>
    </oj-bind-for-each>
  </ul>
</div>

上の例では、data-oj-as属性は、バインドされたデータの別名を提供しています。この別名は、ネストされたoj-bind-for-eachおよびoj-bind-text要素内で参照されています。

次に、この例のviewModelを作成するためのスクリプトを示します。

import 'ojs/ojknockout';
import "ojs/ojbutton";

class ViewModel {
  categories: Array<Object>;

  constructor() {
    this.categories = 
      [{ name: "Fruit", items: ["Apple", "Orange", "Banana"] },
       { name: "Vegetables", items: ["Celery", "Corn", "Spinach"] }     
      ];
  }
}

export = ViewModel;
define(["ojs/ojknockout", "ojs/ojbutton"], 

  function () {

    function ViewModel() {

    this.categories = 
      [{ name: "Fruit", items: ["Apple", "Orange", "Banana"] },
       { name: "Vegetables", items: ["Celery", "Corn", "Spinach"] }     
      ];
    }

    return ViewModel;

  });

次の図は、サンプル・コードの出力を示しています。

この図には、ネストした箇条書きリストがあります。外側のリストには点が2つあり、それぞれ内側に3つの箇条書きリストがあります。内側のリストの箇条書きは、果物と野菜の名前で構成されています。

Oracle JETクックブックには、この項で使用されている完全な例があります。Foreachバインディングに関する項を参照してください。

スタイル・プロパティのバインディング

Oracle JETの属性バインディング構文は、オブジェクトとして渡すかドット表記法で設定することができるスタイル属性もサポートしています。ojknockoutモジュールをインポートする必要があります。

スタイル属性バインディング構文で使用するオブジェクトは、そのスタイル・プロパティがJavaScript名により参照されている必要があります。アプリケーションでは、ドット表記法を使用してスタイル・サブプロパティを設定することもできます。これは、プロパティにCSS名を使用します。次のコード・サンプルは、style属性を含む2つのブロック要素を示しています。最初の要素はstyleオブジェクトをバインドし、2番目の要素は定義済のstyle属性にプロパティを直接バインドしています。

<div id="demo-container">
  <div :style="[[style]]">Data bound style attribute</div>
  <br>
  <div :style.color="[[fontColor]]" :style.font-style="[[fontStyle]]">Data bound style using dot notation</div>
</div>

次に、この例のviewModelを作成するためのスクリプトを示します。上で参照されているstyleオブジェクトは、次のように強調表示されます。

import 'ojs/ojknockout';
import 'ojs/ojlabel';
import 'ojs/ojinputtext';

class ViewModel {
  fontColor = 'blue';
  fontStyle = 'italic';
  style = { fontWeight: 'bold',
            color: 'red' };
}

export = ViewModel;
define(["ojs/ojknockout", "ojs/ojlabel", "ojs/ojinputtext" ], 

  function () {

    function ViewModel() {

        this.fontColor = 'blue';
        this.fontStyle = 'italic';
        this.style = {
            fontWeight: 'bold',
            color: 'red'
          };
      }
    
   }

    return ViewModel;
});

次の図は、サンプル・コードの出力を示しています。この図には2行のテキストが表示されており、最初のテキストは、赤で太字の「Data bound style attribute」です。テキストの2行目は、青で斜体の「Data bound style using dot notation」です。

Oracle JETクックブックには、この項で使用されている完全な例があります。スタイル・バインディングに関する項を参照してください。

イベント・リスナーのJETおよびHTML要素へのバインド

Oracle JETは、on-[eventname]構文の使用とojknockoutモジュールのインポートにより、JETおよびHTML要素へのイベント・リスナーの一方向属性データ・バインディングを提供します。

Oracle JETのイベント属性は、ネイティブHTMLイベント・リスナーについて2つの重要な利点を提供します。第1に、リスナーに次の3つのパラメータを提供します。

  • event: クリックやマウスオーバーなどのDOMイベント。

  • data: bindingContext['$data']と同じ。oj-bind-for-eachなどの繰り返し処理内で使用される場合、このパラメータはbindingContext['$current']と同じです。

  • bindingContext: 要素に適用されているデータ・バインディング・コンテキスト(またはスコープ)の全体。

第2に、モデル状態へのアクセス権があり、dataおよびbindingContextパラメータを使用して、ViewModelに定義されている関数にアクセスできます。

ノート:

thisコンテキストはイベント・リスナーに直接使用できません。これは、ネイティブHTMLイベント・リスナーと同じ動作です。

たとえば、次のコード・サンプルは、oj-buttonではon-oj-actionイベント属性を使用し、HTMLボタンではon-clickイベント属性を使用して、次に示すViewModelで定義されたカスタム関数にアクセスしている例を示しています。

<div id="demo-container">
  <oj-label for="button1">oj-button element</oj-label>
  <oj-button id="button1" on-oj-action="[[clickListener1]]">Click me!</oj-button>
  <br><br>
  <label for="button2">HTML button element</label>
  <br>
  <button id="button2" on-click="[[clickListener2]]">Click me!</button>
  <br><br>
  <div style="font-weight:bold;color:#ea5b3f;">
    <oj-bind-text value="[[message]]"></oj-bind-text>
  </div>
</div>

ノート:

HTMLイベントには、onclickonloadのように、接頭辞"on"を使用します。JETイベントには、on-clickon-loadのように、接頭辞"on-"を使用します。

次に、この例のビュー・モデルを作成するためのスクリプトを示します。messageパラメータにアクセスするためdata属性を使用することに注意してください。

require(['ojs/ojbootstrap', 'knockout', 'ojs/ojbutton', 'ojs/ojlabel', 'ojs/ojknockout'],
  function(Bootstrap, ko) 
  {
    function ViewModel() 
    {
      this.message = ko.observable();

      this.clickListener1 = function(event, data, bindingContext)
      {
        data.message('oj-button is clicked');
      };

      this.clickListener2 = function(event, data, bindingContext)
      {
        data.message('HTML button is clicked');
      };
    }

    Bootstrap.whenDocumentReady().then(
      function ()
      {
        ko.applyBindings(new ViewModel(), document.getElementById('demo-container'));
      }
    );
  });

次の図は、サンプル・コードの出力を示しています。

Oracle JETクックブックには、この項で使用されている完全な例があります。イベント・バインディングに関する項を参照してください。

クラスのバインド

Oracle JETの属性バインディング構文では、class属性のサポートが拡張されており、文字列だけでなくオブジェクトや配列も使用できます。これはコンポーネントのクラスの設定に使用できます。ojknockoutモジュールをインポートする必要があります。

:class属性のバインディングでは、スペース区切り文字列に解決する式、クラス名の配列に解決する式、またはクラスのオブジェクトをDOMのクラスの切替え用にブール値またはブール式に解決する式をサポートできます。オブジェクトの値はクラスのオン/オフの切替えに使用できます。配列と文字列の値はクラスの設定のみに使用できます。

たとえば、次のコード・サンプルは、oj-input-textとHTMLのinputの両方で、:classを使用している例を示しています。

<oj-input-text id="input1"
               :class="[[{'oj-form-control-text-align-right': alignRight}]]"
               value="Text Content"></oj-input-text>
<oj-button id="button2" on-oj-action="[[clickListener2]]">Toggle Alignment</oj-button>

<input id="input2" :class="[[classArrayObs]]"
       value="Text Content" style="width:100%;max-width:18em"/>
<oj-button id="button1" on-oj-action="[[clickListener1]]">Add Class</oj-button>

次に、この例のビュー・モデルを作成するためのスクリプトを示します。

require(['ojs/ojbootstrap', 'knockout', 'ojs/ojlabel', 'ojs/ojinputtext', 'ojs/ojbutton', 'ojs/ojknockout'],
  function(Bootstrap, ko) 
  {
    function ViewModel() 
    {
      this.alignRight = ko.observable(false);
      this.classArrayObs = ko.observableArray();
      var classList = ['pink', 'bold', 'italic'];
      var self = this;

      this.clickListener1 = function(event, data, bindingContext) {
        var newClass = classList.pop();
        this.classArrayObs.push(newClass);

        // Disable the add button once we're out of classes
        if (classList.length === 0)
          document.getElementById('button1').disabled = true;
      }.bind(this);

      this.clickListener2 = function(event, data, bindingContext) {
        self.alignRight(!this.alignRight());
      }.bind(this);;
    }

    Bootstrap.whenDocumentReady().then(
      function ()
      {
        ko.applyBindings(new ViewModel(), document.getElementById('demo-container'));
      }
    );
  });

次に、前述のclassList変数で使用されているCSSクラス・スタイルを示します。

.bold {
  font-weight: bold;
}
.italic {
  font-style: italic;
}
.pink {
  color: #ff69b4;
}

次の図は、サンプル・コードの2つの出力のうち、最初の出力を示しています。ボタンはoj-form-control-text-align-rightクラス・プロパティのオン/オフを切り替えるトグルとして機能し、テキストの位置合せを変更します。

次の図は、サンプル・コードの2つの出力のうち、2番目の出力を示しています。ボタンは関数をコールして事前定義済のクラスの配列を取得し、それをinput要素に追加します。各クラスにはCSS変更が含まれ、これらの変更はクラスが追加されると有効になります。

Oracle JETクックブックには、この項で使用されている完全な例があります。クラス・バインディングに関する項を参照してください。

ページへのOracle JETコンポーネントの追加

Oracle JETクックブックのレシピおよびAPIドキュメントを使用して、ページに追加する特定の要素および機能を示す例を識別します。

まだ作成していない場合は、このエクササイズで使用するアプリケーションを作成します。

ページにOracle JETカスタム要素を追加するには:

  1. Oracle JETクックブックを使用して、追加するOracle JET要素を選択します。
  2. スタータ・テンプレートを使用してアプリケーションを設定している場合、またはページ・フラグメントを使用している場合は、defineブロックに要素を追加します。
  3. 例のレシピに従い、HTMLページにマークアップを追加します。必要に応じて属性を変更します。
    <div id="div1">
      <oj-label for="dateTime">Default</oj-label>
      <oj-input-date-time id="dateTime" value='{{value}}'>
      </oj-input-date-time>
              
      <br/><br/>
              
      <span class="oj-label">Current component value is:</span>
      <span><oj-bind-text value="[[value]]"></oj-bind-text></span>
              
    </div>

    この例では、oj-input-date-time要素は、そのvalue属性で{{...}}式構文を使用して宣言され、このことは、値を変更するとViewModel内の対応する値も更新されることを示します。各Oracle JETカスタム要素には、カスタム要素のAPIドキュメントで定義されている追加属性が含まれます。

  4. RequireJSブートストラップ・ファイルまたはモジュールへのカスタム要素のRequireモジュールとViewModelの追加に使用するスクリプト例および構文については、Oracle JETクックブックを使用します。

    たとえば、oj-input-date-timeの基本的なデモには、アプリケーションで使用できる次のスクリプトが含まれています。

    require(['ojs/ojbootstrap, 'knockout', 'ojs/ojvalidation-base', 'ojs/ojknockout', 'ojs/ojdatetimepicker', 'ojs/ojtimezonedata', 'ojs/ojlabel'], 
      require(['knockout', 'ojs/ojbootstrap',
               'ojs/ojconverterutils-i18n', 'ojs/ojknockout',
               'ojs/ojdatetimepicker', 'ojs/ojlabel'],
    
      function (Bootstrap, ko, ConverterUtilsI18n)
      {
        function SimpleModel()
        {
          this.value = ko.observable(ConverterUtilsI18n.IntlConverterUtils.dateToLocalIso(new Date(2020, 0, 1)));
        }
    
        Bootstrap.whenDocumentReady().then(
          function ()
          {
            ko.applyBindings(new SimpleModel(), document.getElementById('div1'));
          }
        );
      });
    

    RequireJSブートストラップ・ファイルまたはモジュールがすでにある場合は、そのファイルをクックブックのサンプルと比較して差異をマージします。RequireJSの使用の詳細は、「モジュラ開発に対するRequireJSの使用」を参照してください。

この項で使用されるクックブックのサンプルは日時ピッカーのデモです。

アニメーション効果の追加

oj-moduleコンポーネントのanimationプロパティをModuleAnimationsネームスペースとともに使用して、あるビューから別のビューにユーザーが遷移またはドリルする際のアニメーション効果を構成できます。oj-moduleを使用していない場合は、AnimationUtilsネームスペースをかわりに使用して、Oracle JETコンポーネントまたはHTML要素にアニメーションを追加できます。

oj-moduleコンポーネントを使用したアニメーション効果の追加

ModuleAnimationsネームスペースには、次のアニメーション効果の構成に使用できる事前構成済の実装が含まれています。

  • coverStart: 古いビューを隠すように新しいビューが横にスライドします。

  • coverUp: 古いビューを隠すように新しいビューが上にスライドします。

  • drillIn: アニメーション効果はプラットフォームに依存します。

    • WebおよびiOS: coverStart

    • Android: coverUp

  • drillOut: アニメーション効果はプラットフォームに依存します。

    • WebおよびiOS: revealEnd

    • Android: revealDown

  • fade: 新しいビューがフェード・インし、古いビューがフェード・アウトします。

  • goLeft: 左側の兄弟ビューに移動します。デフォルトの効果はプラットフォームに応じて異なります。

    • WebおよびiOS: なし

    • Android: pushRight

  • goRight: 右側の兄弟ビューに移動します。デフォルトの効果はプラットフォームに応じて異なります。

    • WebおよびiOS: なし

    • Android: pushLeft

  • pushLeft: 新しいビューが古いビューを左に押し出します。

  • pushRight: 新しいビューが古いビューを右に押し出します。

  • revealDown: 新しいビューが見えるように古いビューが下にスライドします。

  • revealEnd: ロケールに従って、新しいビューが見えるように、新しいビューが右または左にスライドします。

  • zoomIn: 新しいビューがズーム・インします。

  • zoomOut: 古いビューがズーム・アウトします。

oj-moduleコンポーネントを使用してアニメーションを追加する方法を示す例は、モジュール・コンポーネントによるアニメーション効果を参照してください。

AnimationUtilsを使用したアニメーション効果の追加

AnimationUtilsネームスペースには、HTML要素およびOracle JETコンポーネントで次のアニメーション効果を構成するために使用できるメソッドが含まれています。

  • collapse: 要素の縮小に使用します

  • expand: 要素の展開に使用します

  • fadeInおよびfadeOut: 要素のフェード・インとフェード・アウトに使用します。

  • flipInおよびflipOut: 要素を回転させて表示したり、非表示にするために使用します。

  • ripple: 要素に波紋を広げるために使用します。

  • slideInおよびslideOut: 要素のスライド・インとスライド・アウトに使用します。

  • zoomInおよびzoomOut: 要素のズーム・インとズーム・アウトに使用します。

メソッドのオプションに応じて、delaydurationおよびdirectionなどのプロパティを構成できます。AnimationUtilsネームスペースを使用してアニメーションを構成する方法を示す例は、アニメーション効果を参照してください。

追加したコンポーネントの表示の管理

DOM内のOracle JETコンポーネントの表示をプログラムで管理する場合は、推奨されるベスト・プラクティスに従ってください。

コレクション・コンポーネントやその他の複雑なコンポーネントの表示を、noneまたはblockのCSS displayプロパティ値で管理する場合、コンポーネントを非表示にするにはComponents.subtreeHidden(node)を、コンポーネントを表示するにはComponents.subtreeShown(node)の使用が必要になる場合もあります。nodeパラメータは、表示または非表示にするコンポーネントのDOM内のサブツリーのルートを参照します。これらのタイプのコンポーネントの表示ステータスを変更した場合は、アプリケーションでコンポーネント・インスタンスが引き続き正しく機能するよう、Oracle JETに通知する必要があります。

表示の管理をプログラムで行っているコンポーネントの表示状態を変更する場合、必ずしもOracle JETに通知が必要というわけではありません。oj-collapsibleoj-dialogoj-popupなどのコンポーネントは、Components.subtreeHidden(node)またはComponents.subtreeShown(node)をコールする必要がないコンポーネントの例です。これらのコンポーネントは、表示が変更されたときのレンダリングを管理し、その中に含まれるコンポーネントも管理します。同様に、Oracle JETはoj-bind-ifコンポーネントのtest条件の評価に応じて、DOMの適切な部分をリライトするため、これらのメソッドをoj-bind-ifコンポーネントと組み合せて使用する必要はありません。

コンポーネントを表示または非表示にする際に、subtreeHiddenおよびsubtreeShownメソッドでOracle JETに通知しない場合、データのレンダリングが失敗したり、他のコンポーネント属性の設定が優先されなかったりするなど、コンポーネントで予期しない動作が発生する可能性があります。subtreeHiddenおよびsubtreeShownメソッドの詳細は、『Oracle® JavaScript Extension Toolkit (Oracle JET) APIリファレンス』を参照してください。