バージョン

新しいコンボへの移行

トピックの概要

このトピックは、古いコンボから新しいコンボへの移行を支援することを目的としています。以前に行っていたシナリオと現在行うことのできるシナリオを示します。

このトピックの内容

このトピックは、以下のセクションで構成されます。

  1. 一般的な変更点
  2. オプションの変更点
  3. 新しいオプション
  4. API メソッドの変更点
  5. 新しい API メソッド
  6. テーマの変更
  7. イベントの変更点
  8. 新しいイベント
  9. Knockout 統合の変更点
  10. Knockout の後方互換性
  11. 要件

一般的な変更点

オプション 説明
項目 項目は、ドロップダウン リストのリスト項目を表すために使用する新しい構造の呼び方です。項目は、elementdata という 2 つのプロパティを持つオブジェクトです。element はリスト項目に対する jQuery 参照です。data はこの要素の背後にあるデータ ソースからの対応データです。data は、データ ソース内の対応するデータ項目に対する参照です。text フィールドと value フィールドを含み、そのプロパティ名が既知である場合、item.data.textPropertyName または item.data.valuePropertyName によりアクセスできます。プロパティ名が不明の場合や変更された可能性がある場合は、コンボから直接プロパティ名を取得することでアクセスできます。つまり、value フィールドについては item.data[$("#combo").igCombo("option", "valueKey")]、text フィールドについては item.data[$("#combo").igCombo("option", "textKey")] です。

オプションの変更点

オプション 以前 現在
width $('#combo').igCombo({ width: 300 }) デフォルトの幅は css により設定されます。新しいコンボ幅を設定する推奨方法は、<style>.ui-igcombo-wrapper { width: 300px } </style> です。古い方法もサポートされます。
height $('#combo').igCombo({ height: 300 }) デフォルトの高さは css により設定されます。新しいコンボの高さを設定する推奨方法は、<style>.ui-igcombo-wrapper { height: 300px } </style> です。古い方法もサポートされます。
enableDisplayBlock $('#combo').igCombo({ enableDisplayBlock: true}) このオプションは削除されました。現在、これは css により制御できます: <style>.ui-igcombo-wrapper { display: block }</style>
mode 以前にサポートされていた値: editable, dropdown, readonlylist, readonly, 0, 1, 2, 3 現在サポートされる値: editable, dropdown, readonlylist, readonly。ドロップダウン モードは、現在、html の要素選択動作に非常に似ています。選択が単一である場合、常に選択された項目が存在し、クリア ボタンはデフォルトで無効になります。
renderMatchItems - このオプションの名前は、その動作そのものを表すために、highlightMatchesMode に変更されました。
filteringType filteringType のデフォルトは 'none' 現在、filteringType のデフォルトは'local' であるため、デフォルトでローカル フィルタリングが有効にされます。コンボの初期化時にフィルタリングを無効にするには $('#combo').igCombo({ filteringType: 'none' })、またはコンボがすでに作成されている場合には $('#combo').igCombo('option', 'filteringType', 'none' }) を使用します。
selectedItems 最初に選択される項目の指定、およびコンボが作成された後に選択された項目の設定または取得のために使用されていました。 このオプションは削除されました。最初に選択される項目は、新しいオプション initialSelectedItems を使用して設定できます。設定の選択は、コンボ API メソッド valueselect または index により行われます。選択された項目の取得は、API メソッド selectedItems により行うことができます。
multiSelection 以前にサポートされていた値: null、false、0、off、true、1、on、2、onWithCheckboxes' 現在、このオプションはすべての複数選択設定をセットアップするために使用されます。以下の設定を持つオブジェクトを提供できます: enabled、addWithKeyModifier、showCheckboxes、itemSeparator。複数選択を有効にするには、enabledtrue に設定します。すでに選択された項目に項目を追加する場合に、ctrl キーを押し続けるようにするには、addWithKeyModifier を true に設定します。デフォルトでは、すべての選択は ctrl キーを押さなずに追加できます。各リスト項目の前にチェックボックスを描画するには、showCheckboxestrue に設定します。選択された項目の間に描画する文字を変更するには、itemSeparator を設定します。デフォルトの文字は「,」です。すべてを設定した例: $('#combo').igCombo({ multiSelection: { enabled: true, addWithKeyModifier: true, showCheckboxes: true, itemSeparator: ', ' } })
itemSeparator 選択された項目の間に描画する文字を変更するために使用されていました。 このオプションは削除され、multiSelection オプションの設定として追加されました。
enableActiveItem キーボードによるナビゲーション時にアクティブな項目を有効または無効にするために使用されていました。 このオプションは削除されました。選択が単一である場合、アクティブ項目は削除され、キーボードによるナビゲーションで選択を変更します。アクティブ項目は、複数選択が有効な場合は常に有効です。
dropDownMaxHeight dropDownMinHeight ドロップダウン リストの最大と最初の高さを設定するために使用されていました。 これらのオプションは削除されました。新しいオプション visibleItemsCount がドロップダウンの高さを制御するために追加されています。
dropDownAsChild コンボ要素の子としてドロップダウン リストを描画するために使用されていました。 dropDownAttachedToBody に名前変更されました。デフォルト値は true です。ドロップダウンを子として描画するには false に設定します: $('#combo').igCombo({ dropDownAttachedToBody: false })
showDropDownButton ドロップダウン ボタンの表示状態を制御するために使用されていました。 このオプションは削除されました。ドロップダウン ボタンの表示状態は、css により制御できます。ドロップダウン ボタンを無効にするには: <style>#combo .ui-igcombo-button { display: none; }</style>
nullText テキスト入力が空の場合に表示するテキストを指定するために使用されていました。 placeHolder に名前変更されました。既知の問題ですが、このオプションは IE8/9 では機能しません。
closeDropDownOnSelect 選択されたときにドロップダウンを閉じるかどうかを指定するために使用されていました。 マウス クリックで、またはエンター キーを押して、リストで単一項目が選択された場合に、ドロップダウン リストを閉じるかどうかを指定するように変更されました。デフォルトは、単一選択に対しては false、複数選択に対しては true です。このオプションは、複数選択が有効で、追加選択が実行された場合、ドロップダウンを閉じません。$('#combo').igCombo({ closeDropDownOnSelect: false })
allowCustomValue コンボのテキスト入力でカスタム値を許可するために使用されていました。 このオプションは初めはサポートされませんでしたが、15.1 の 9 月サービス リリースおよび 15.2 のボリューム リリースでご利用いただけます。
dataBindOnOpen ドロップダウンが開かれる際にデータ バインディングを延期するために使用されていました。 このオプションはサポートされていません。同じ機能性は、ドロップダウン リストが最初に開かれる際に、データ バインディング イベントとデータ バインドをキャンセルすることにより実現できます。
text 初期化時にコンボ入力にカスタム テキストを設定するために使用されていました。 このオプションはサポートされていません。初期選択を設定するには、オプション initialSelectedItems を使用します。
clearSelectionOnBlur テキスト入力が選択された項目テキストと一致しなかった場合に、選択された項目をぼかして保持するために使用されていました。主に allowCustomValues オプションとともに使用されていました。 このオプションはサポートされていません。
valueKeyType textKeyType value / text データの背後のデータ型を指定するために使用されていました。 これらのオプションはサポートされていません。データ ソースからの value フィールドと text フィールドの型が使用されます。
parentCombo cascadingDataSources parentComboKey カスケード機能をセットアップするために使用されていました。 これらのオプションはサポートされていません。内部カスケード機能はサポートされなくなりました。これは、現在のコンボの選択変更イベントで関係するコンボ データ ソースを変更することで実現できます。サンプル参照

新しいオプション

オプション 説明
initialSelectedItems 選択される項目のインデックスまたは値を指定することで、最初にコンボを作成する際に選択が必要な項目の設定に使用: $('#combo').igCombo({ initialSelectedItems: [{ index: 2 }, { index: 5 }, { value: 'items_value' }] })
visibleItemsCount このオプションは、一度に表示できる項目の最大数を制御するために使用できます。これが 10 に設定され、リストに 20 項目ある場合、一度に 10 項目のみが表示されます。5 項目のみがリストにある場合は 5 項目のみが表示され、ドロップダウンの高さは 5 項目分の高さになります。デフォルト値は 15 です。$('#combo').igCombo({ visibleItemsCount: 10 })
autoSelectFirstMatch 入力されたテキストで始まる最初のリスト項目を自動的に選択するかどうかを指定します。複数選択が有効な場合、このオプションは一致する要素にアクティブ項目を置きます。無効な場合、完全一致のみが自動的に選択されます。デフォルトでは true に設定されています。無効にするには: $('#combo').igCombo({ autoSelectFirstMatch: false })
delayFilteringOnKeyUp 次のフィルタリング操作をトリガーするまでの遅延時間を指定します。フィルタリング操作回数を少なくすることで、パフォーマンス向上に役立ちます。デフォルトは 250 ミリ秒です。変更するには: $('#combo').igCombo({ delayFilteringOnKeyUp: 1000 })
preventSubmitOnEnter エンター キーが押された場合にデフォルト フォームの送信を行わないかどうかを指定します。デフォルトは true です。無効にするには: $('#combo').igCombo({ preventSubmitOnEnter: false })

すべてのオプションを参照

API メソッドの変更点

メソッド 以前 現在
dropDownVisible ドロップダウン リストの表示状態を制御するために使用されていました。 この API メソッドは削除されました。ドロップダウン リストを開くには openDropDown、ドロップダウン リストを閉じるには closeDropDown を使用してください。
setFocus コンボ テキスト入力にフォーカスを設定するために使用されていました。 この API メソッドは削除されました。テキスト入力にフォーカスを設定するには、入力で jQuery focus メソッドを呼び出します: $("#combo").igCombo("textInput").focus()
hasFocus コンボ テキスト入力にフォーカスがあるかどうかをチェックするために使用されていました。 この API メソッドは削除されました。テキスト入力にフォーカスがあるかどうかチェックするには、jQuery is(":focus") を使用します: $("#combo").igCombo("textInput").is(':focus').
isSelected 指定されたインデックスのリスト項目が選択されているかどうかをチェックするために使用されていました。 項目の選択をチェックする API メソッドは 3 つあります。jQuery 参照によるisSelected、インデックスによる isIndexSelected、値による isValueSelected です。
selectedIndex 最初に選択された項目のインデックスを取得するため、またはインデックスによる選択を設定するために使用されていました。 この API メソッドは index に名前変更されました。このメソッドは、インデックスの配列も受け入れ、一度に複数の項目を選択できます。複数の項目が選択された場合、選択されたすべてのインデックスを持つ配列を返します。その他の機能は同じです。
value 最初に選択された項目の値を取得するため、または値による選択を設定するために使用されていました。 このメソッドは値の配列も受け入れ、一度に複数の項目を選択できます。複数の項目が選択された場合、このメソッドは選択されたすべての値を持つ配列を返します。その他の機能は同じです。
values 選択されたすべての項目の値を取得するため、または値による選択を設定するために使用されていました。 この API メソッドは削除されました。この機能は value メソッドに統合されました。
itemByIndex 特定のインデックスのリスト項目に関係するメンバーを持つオブジェクトを取得するために使用されていました。{ element, index, value, text } のオブジェクトを返すために使用されていました。 この API メソッドは itemFromIndex に名前変更されました。返されるオブジェクトは item です。
itemByValue 特定の値のリスト項目に関係するメンバーを持つオブジェクトを取得するために使用されていました。{ element, index, value, text } のオブジェクトを返すために使用されていました。 この API メソッドは itemFromValue に名前変更されました。返されるオブジェクトは item です。
getDataSource コンボにより使用されるデータ ソースへの参照を取得するために使用されていました。 この API メソッドは削除されました。データ ソースへの参照は、$("#combo").igCombo("option", "dataSource") により取得できます。
getData コンボにより使用される現在のデータへの参照を取得するために使用されていました。 この API メソッドは削除されました。現在のデータへの参照は、 $("#combo").igCombo("option", "dataSource").dataView() により取得できます。
getRecordsCount dataSource、dataView、または全サーバー データのレコード数を取得するために使用されていました。 この API メソッドは削除されました。dataSource のレコード数を取得するには: $("#combo").igCombo("option", "dataSource").data().length。dataView のレコード数を取得するには: $("#combo").igCombo("option", "dataSource").dataView().length。全サーバー データのレコード数を取得するには: $('#combo').igCombo('option', 'dataSource').totalRecordsCount()
filter event, filterText, noFilter のメソッド パラメーターが使用されていました。 メソッド パラメーターは filterText, event に変更されました。
remove 他の機能は残しながら、親要素からコンボを削除するために使用されていました。 この API メソッドはサポートされていません。
getFooter コンボ フッターへの参照を取得するために使用されていました。 現在フッターがないため、この API メソッドはサポートされていません。

新しい API メソッド

メソッド 説明
openDropDown ドロップダウン リストを開くには、このメソッドを使用します。
closeDropDown ドロップダウン リストを閉じるには、このメソッドを使用します。
select 項目の jQuery 参照に渡すことにより、1 つまたは複数のリスト項目を選択するために使用します。$('#combo').igCombo('select', $('.itemSelector'))
value 値により、1 つまたは複数のリスト項目を選択するために使用します。単一項目を選択するには $('#combo').igCombo('value', 'itemValue')、一度に複数項目を選択するには $('#combo').igCombo('value', ['itemValue_1', 'itemValue_2', 'itemValue_3'])。パラメーターを指定せずにこのメソッドを呼び出すと、選択された値が返されます。
index データ ソースのインデックスにより、1 つまたは複数のリスト項目を選択するために使用します。単一項目を選択するには $('#combo').igCombo('index', 5)、複数の項目を選択するには $('#combo').igCombo('index', [3, 5, 8, 10])。パラメーターを指定せずにこのメソッドを呼び出すと、選択されたインデックスが返されます。
isSelected 特定の jQuery 要素が選択されているかどうかをチェックするために使用します。$('#combo').igCombo('isSelected', $('.selector'))
isIndexSelected 特定のインデックスの項目が選択されているかどうかをチェックするために使用します。$('#combo').igCombo('isIndexSelected', 5)
isValueSelected 特定の値を持つ項目が選択されているかどうかをチェックするために使用します。$('#combo').igCombo('isValueSelected', 'itemValue')
dataForValue valueKey プロパティと一致する値により、リスト項目の関連付けられたデータ ソース データを取得します。$('#combo').igCombo('dataForValue', 'itemValue')
dataForElement jQuery 参照により、リスト項目の関連付けられたデータ ソース データを取得します。$('#combo').igCombo('dataForElement', $('.listItemSelector'))
itemsFromElement jQuery 要素により、コンボのリスト項目要素を表す項目を取得します。メソッドに複数の要素が与えられた場合、項目を持つ配列が返されます。$('#combo').igCombo('itemsFromElement', $('.listItemSelector'))
itemsFromValue 値により、コンボのリスト項目要素を表す項目を取得します。メソッドに値の配列が与えられた場合、項目を持つ配列が返されます。$('#combo').igCombo('itemsFromValue', 'itemValue')
itemsFromIndex インデックスより、コンボのリスト項目要素を表す項目を取得します。メソッドにインデックスの配列が与えられた場合、項目を持つ配列が返されます。$('#combo').igCombo('itemsFromIndex', 3)
items コンボのすべての項目を持つ配列を取得します。
filteredItems コンボでフィルター処理されたすべての項目を持つ配列を取得します。
selectedItems 選択された項目を取得します。複数の項目が選択されている場合、選択された項目を持つ配列が返されます。
listItems コンボ ドロップダウン リストで描画されたすべてのリスト項目に対する jQuery 参照を取得します。
clearFiltering フィルタリングをクリアします。
clearInput テキスト入力値を消去し、すべての選択、フィルタリング、強調表示を削除します。
selectAll すべてのリスト項目を選択します。
deselect jQuery 参照によりリスト項目を選択解除します。
deselectByValue 特定の値のリスト項目を選択解除します。
deselectByIndex 特定のインデックスのリスト項目を選択解除します。
deselectAll 選択されたすべてのリスト項目を選択解除します。
comboWrapper コンボのアウター要素に対する jQuery 参照を取得します。
dropDown コンボのドロップダウン リストに対する jQuery 参照を取得します。
textInput コンボのテキスト入力に対する jQuery 参照を取得します。
valueInput コンボの値入力に対する jQuery 参照を取得します。
dropDownOpened ドロップダウンが開いているかどうかをチェックします。

すべての API メソッドを参照

テーマの変更

イベント 変更内容
ui-igcombo-nulltext このクラスは削除されました。たとえば、コンボの入力要素にテキスト色を適用するには、以下の実装を使用できます。
<style>
      input#combo::-webkit-input-placeholder {
        color: red;
      }
</style>

注: ブラウザーに基づいて (:-moz-placeholder, :-ms-input-placeholder); を使用します。

イベントの変更点

イベント 変更点
selectionChanging イベント引数 ui.oldItems は ui.currentItems に名前変更され、選択変更がされずに、現在その項目の選択が継続していることをより明確に表すようになりました。項目は item 形式です。
selectionChanged 項目は item 形式です。
dropDownOpening dropDownOpened dropDownClosing dropDownClosed イベント引数 ui.element は ui.list に名前変更され、これがドロップダウン リストであることをより明確に表すようになりました。
textChanged このイベントは削除されました。テキストの変更時点をチェックするには、コンボをテキスト入力キーダウン イベントにバインドします。
noMatchFound autoComplete 機能はまだ完全にサポートされていないため、このイベントは削除されました。
activeItemChanging activeItemChanged これらのイベントは削除されました。

新しいイベント

イベント 説明
rendered コンボのレンダリングが完了したときに発生するイベント。
itemsRendering コンボ項目のレンダリングが実行される前に発生するイベント。
itemsRendered コンボ項目のレンダリングが完了した後に発生するイベント。関数 callback は、描画されたリスト項目要素を表す項目の配列である引数 ui.items に渡されます。

すべてのイベントを参照

Knockout 統合の変更点

コンボをリストからのみ値を受け入れるコントロールと考えることが、新しい igCombo コントロールに導入された変更点の 1 つです。igCombo にはカスタム値を許可するオプションはありません。以前は、Knockout 拡張機能での異なる作業プロセスのためにカスタム値が必要でした。すなわち、igCombo が変更について View-Model に通知できるのは、項目が選択 / 選択解除されるとき、および選択された項目コレクションが変更されるときのみです。したがって、古い Knockout 拡張オプションの一部が必要なくなり、必要ないくつかのオプションが導入されました。igCombo を Knockout 拡張機能と統合するために、以下の変更が行われました。

新しいオプション

オプション 説明
selectedItems igCombo で選択された項目の配列。View-Model でこのオプションが構成されている場合、コンボで選択された項目と View-Model との間のデータ交換があることを保証します。
selectedItemType 配列での選択項目の型を "primitive" または "object" として構成できます。

削除されたオプション

オプション 説明
text 入力の変更が発生した場合、コンボは View-Model を更新できません。
古い igCombo では、コンボ値を保持する View-Model プロパティがあり、更新されると他のサブスクライバーに通知されていました。igCombo の Knockout 拡張機能にはそのようなオプションは存在しなくなったため、selectionChanged イベント ハンドラーを使用して現在のコンボ値を取得し、サブスクライバーに通知できます。以下の表のコード スニペットで、古い機能をシミュレートする方法を示します。
value 値により項目を選択する場合、新たに導入された selectedItems オプションが使用されるため、このオプションは必要なくなりました。
enableTextChangedUpdate igCombo には textChanged イベントがないため、このような機能を持つことはできません。
enableSelectionChangedUpdate 新しい変更では、更新は常にコンボの選択変更時に発生します。それがこのようなオプションが不要になった理由です。
cascadingDataSource igCombo コントロールにはこのようなオプションはありません。それが Knockout 拡張機能でも使用できない理由です。

<script type="text/javascript">
var model = [
    { name: "Adam Sandler", id: "nm0001191" },
    { name: "Brooke Shields", id: "nm0000222" },
    { name: "Charles Chaplin", id: "nm0000122" },
];
var viewModel = new ViewModel(model);
 function ViewModel(actorsList) {
    this.selectedActor = ko.observable(actorsList[0].name);
 }
</script>
<span id="comboActors" data-bind="igCombo: {
    text: selectedActor,
    textKey: 'name',
    valueKey: 'id'
}"></span>

現在

<script type="text/javascript">
var model = [
    { name: "Adam Sandler", id: "nm0001191" },
    { name: "Brooke Shields", id: "nm0000222" },
    { name: "Charles Chaplin", id: "nm0000122" },
];
var viewModel = new ViewModel(model);
 function ViewModel(actorsList) {
    this.selectedActor = ko.observable(actorsList[0].name);
    this.selectedActorNew = ko.observableArray([actorsList[0].id]);
    this.selectionChanged = function(e, args) {
        this.selectedActor(args.items[0].data.name);
    }
 }
</script>
<span id="comboActors" data-bind="igCombo: {
    selectedItems: selectedActorNew,
    textKey: 'name',
    valueKey: 'id',
    selectionChanged: selectionChanged
}"></span>

注: これは、igCombo から View-Model への変更がある場合のみ機能します。

Knockout の後方互換性

新しいコンボおよびその Knockout 拡張子が更新されているため、アーキテクチャも変更されました。コンボの選択コレクションがドロップダウンの項目に利用可能な値のみを許可するためにデザインされました。Knockout 拡張子はそのパターンを使用し、コンボの変更をモニターする監視可能な項目は選択された項目の配列です。 以前のバージョンで拡張子がコンボ フィールドをモニターしました。新しい実装では、単一の選択だけでなく、複数の選択された項目をモニターできます。

この方法で、監視可能な入力要素が監視可能配列として定義できないため、igCombo を HTML 入力要素にバインドできません。一方、igEditors およびその拡張子が、HTML 入力要素と動作するようデザインされています。igCombo を HTML 入力要素と結合するには、以前のセクション (Knockout 結合の変更) に説明した実装を使用できます。 このセクションのコードはカスタム解決を紹介します。ViewModel および View のコードに変更せずに新しい igCombo および Knockout 拡張子を使用できます。このポリフィルは、Ignite UI for jQuery の最新バージョンにアップグレードしますが、現在のコードを選択通知を処理するために変更できない場合に便利です。

以下のバインド ハンドラーを igCombo の Knockout ハンドラーを読み込んだ後に定義します。

<script type="text/javascript">
ko.bindingHandlers.igComboPolyfill = {
    init: function (element, valueAccessor) {
        var combo = $(element),
            isMultiple = valueAccessor().multiSelection ? valueAccessor().multiSelection.enabled : false;

        ko.utils.registerEventHandler(element, "igcomboselectionchanged", function (evt, ui) {
            var item = ui.items[0], dataItem, newText, newValue;

            if (isMultiple) {
                if (ko.isObservable(valueAccessor().text)) {
                    valueAccessor().text(combo.igCombo("text"));
                }
            } else {
                if (item !== undefined) {
                    dataItem = item.data;
                    if (ko.isObservable(dataItem)) {
                        dataItem = dataItem();
                    }
                    newText = dataItem[valueAccessor().textKey];
                    newValue = dataItem[valueAccessor().valueKey];

                    if (ko.isObservable(valueAccessor().text)) {
                        if (ko.isObservable(newText)) {
                            newText = newText();
                        }
                        valueAccessor().text(newText);
                    }
                    if (ko.isObservable(valueAccessor().value)) {
                        if (ko.isObservable(newValue)) {
                            newValue = newValue();
                        }
                        valueAccessor().value(newValue);
                    }
                }
            }
        });

        ko.utils.registerEventHandler(element, "igcombodropdownclosed", function (evt, ui) {
            if (isMultiple) {
                if (ko.isObservable(valueAccessor().text)) {
                    valueAccessor().text(combo.igCombo("text"));
                }
            }
        });

        ko.applyBindingsToNode(element, { igCombo: valueAccessor() });
    },
    update: function (element, valueAccessor) {
        var combo = $(element),
            value = valueAccessor().text();

        if (combo.igCombo("text") !== value) {
            $(element).igCombo("text", value);
        }
    }
};
</script>

以前のロジックを使用し、監視可能項目を文字列として定義できます。

<script type="text/javascript">
var model = [
    { name: "Adam Sandler", id: "nm0001191" },
    { name: "Brooke Shields", id: "nm0000222" },
    { name: "Charles Chaplin", id: "nm0000122" },
];
var viewModel = new ViewModel(model);
 function ViewModel(actorsList) {
    this.selectedActor = ko.observable(actorsList[0].name);
 }
</script>
<span id="comboActors" data-bind="igCombo: {
    text: selectedActor,
    textKey: 'name',
    valueKey: 'id'
}"></span>
<input type="text" data-bind="value: selectedActor"/><br />

jQuery の要件

Lib 以前の必要バージョン 新しい必要バージョン
jQuery コア 1.4.4 1.8.3
jQuery UI 1.7 1.9.2

オンラインで表示: GitHub