selectMatchの角度ui-bootstrap typeaheadコールバック?


92

私は角度付きui-bootstrap typeaheadを使用していて、多くの選択肢を選択する方法としてそれを使用したいので、selectMatchメソッドが起動されたときに選択された値を取得する必要がありますが、方法が見つかりませんそれは私のコントローラーで

<div class='container-fluid' ng-controller="TypeaheadCtrl">
<pre>Model: {{selected| json}}</pre>
<input type="text" ng-model="selected" typeahead="state for state in states | filter:$viewValue">

選択した値を見ると、キーを押すたびに変化が出ます...

scope.$watch('selected', function(newValue, oldValue) {... });

selectMatchメソッドは、ユーザーがEnterキーを押すか、リストをクリックすると呼び出されるメソッドであることがわかりましたが、それにコールバックする方法がわかりません...

よろしくお願いします!

回答:


250

これを行うには今より良い方法があります。新しいコールバックメソッドが追加されました

コントローラファイルに以下を追加します。

 $scope.onSelect = function ($item, $model, $label) {
    $scope.$item = $item;
    $scope.$model = $model;
    $scope.$label = $label;
};

ビューに以下を追加します。

 <input type="text"
        ng-model="selected"
        typeahead="state for state in states | filter:$viewValue"
        typeahead-editable="false"
        typeahead-on-select="onSelect($item, $model, $label)"/>

詳細については、先行入力仕様を参照してください(onSelectを検索)。

次のURLがhttp://www.techguides.in/how-to-create-autocomplete-using-angularjs-ui/に役立つかどうかを確認して ください

http://www.techguides.in/how-to-customize-autocomplete-to-display-multiple-columns-using-angularjs-ui-2/


2
ありがとう!魅力のように働いた。これはおそらく、正式に先行入力された文字の見出しの下の参照ページで文書化する必要があります。 angular-ui.github.io/bootstrap
ariestav

29
$ item $ model $ labelオブジェクトが実際にそのコールバックtypeahead-on-select = 'onSelect($ item、$ model、$ label)'にどのようなものがあるか誰かが知っていますか?
AardVark71 14年

@マット、とにかくonSelectイベントで$ httpを使用してポストバックを実行できますか?
Pratik Gaikwad 2014

15
@ AardVark71 $ item $ model $ labelこれらの3つのプロパティはそれぞれ以下のとおりです。複数のプロパティを持つオブジェクトのJSON配列をバインドする場合、すべてのプロパティを含む$ itemで選択されたアイテムを取得します。$ modelは、選択されたitem.valueを格納する組み込みの角度モデルであり、$ lableは、選択後にテキストボックスに表示される値を提供します。したがって、多くの場合、$ labelは$ modelと等しくなります。これであなたの疑問が明確になることを願っています。
Pratik Gaikwad 2014

16
@ AardVark71式が次のようなものであるかどうかを説明する方が簡単です state.id as state.name for state in states。その場合、$itemあるstate$モデルである、state.id$labelあるstate.name
Aximili

10

編集:この方法は今のところ最良のものではありません。上記の回答で説明したように、onSelectコールバックを使用することをお勧めします。

自分のやりたいことをどのように行うかを見つけました。typeahead-editable属性があり、falseに設定されている場合、モデルからの値が選択された場合にのみ、選択された値が変更されることがわかりました。したがって、$ watchは、新しい値が選択されたときにチェックするために正常に機能しています。

<input type="text" ng-model="selected" typeahead="state for state in states | filter:$viewValue" typeahead-editable="false">

link: function(scope, elm, attrs){
    scope.$watch('selected', function(newValue, oldValue) {
        if (newValue)
          console.log(oldValue+"->"+newValue);
     });
}

2

以下はあなたのHTMLでなければなりません

 <input id="title" type="text"  ng-model="title"  typeahead="data.enquiry_title for data in titleData | filter:$viewValue | limitTo:8" 
typeahead-on-select='onSelect($item, $model, $label)' />

コールバック関数を使用して、入力タグにtypeahead-on-selectを追加するだけです。

以下はコントローラの内部に入ります

$scope.onSelect = function ($item, $model, $label) {
            console.log($item);
            if($item.tid)
                $scope.activeTitleId = $item.tid
        };

$ item内では、提案リストのメイン配列で渡したオブジェクト全体を取得します


0

検証前に以下を試してください

 modelCtrl.$setValidity('editable', true);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.