Angular-UIがUI-Select2ディレクティブを廃止し、新しいUI-Select(複数のテーマ(select2、bootstrap、selectize)を使用)を採用していることに気付きました。
次のようになります。
<ui-select multiple ng-model="multipleDemo.colors" theme="select2" ng-disabled="disabled" style="width: 300px;">
<ui-select-match placeholder="Select colors...">{{$item}}</ui-select-match>
<ui-select-choices repeat="color in availableColors | filter:$select.search">
{{color}}
</ui-select-choices>
</ui-select>
<p>Selected: {{multipleDemo.colors}}</p>
最初、私の選択ボックスは空であるはずですが、入力された文字、つまり少なくとも4文字の文字列を受け取る準備ができており、API呼び出しを行って、ボックスに入力する推奨値のリストを取得します。次に、1つの値が選択され、必要に応じて検索を繰り返す必要があります。
最初に、$watch
をng-model
してみました。この場合はmultipleDemo.colors
です(デモのこの例を使用)。 API呼び出しは発生しなかったので、その理由に気づきました。実際のモデルは、選択が行われたときにのみ変更されるため、まったく変更されません(私の選択ボックスは空なので、何も選択できません)。
私の結論は、フィルターとして追加されたもの、つまり$watch
をfilter: $select.search
する必要があるということです。
誰かが私のコントローラーでそれをどのように使用することになっているのか知っていますか?
この:
$scope.$watch('$select.search', function(newVal){
alert(newVal);
});
動作しません。
編集:誰かの参考のために、この短い議論を参照してください: select2のようなカスタムクエリ関数のサポートを追加することは可能ですか?
編集2:
ディレクティブ内から$emit
を使用してこれを解決したので、値がコントローラーで使用できるようになりました。しかし、ディレクティブ自体をそのままにして、将来の更新で壊れないように、ディレクティブのこの部分をオーバーライドする方法を知りたいのですが。
_<ui-select-choices>
_要素のrefresh
属性を使用して、パラメーターとして_$select.search
_を使用してスコープの関数を呼び出します。
_<ui-select-choices repeat="color in multipleDemo.availableColors | filter:$select.search"
refresh="refreshColors($select.search)"
refresh-delay="0">
{{color}}
</ui-select-choices>
_
次に、関数(このスニペットではrefreshColors()
)を使用して、それに応じて_multipleDemo.availableColors
_を更新します。
_refresh-delay
_属性を使用して、関数をデバウンスするミリ秒数を指定して、すばやく連続して何度も呼び出されないようにすることもできます。
_multipleDemo.colors
_に対して行ったように、availableColors
をmultipleDemo
に配置しました。 推奨 も同様です。
参照: i-selectディレクティブwiki セクションの下例:非同期。
on-select
属性があるようです。 Githubの例 を参照してください:
<ui-select ng-model="person.selected" on-select="someFunction($item, $model)" [...]>
[...]
</ui-select>
我慢してください、これがSOに関する私の最初の答えです。
したがって、現在のトップの答えは私にはうまくいきません。別のオプションを提供したいだけです。 ui-select-choicesのrefreshプロパティは、スコープ内の名前付き関数をトリガーしません。
カスタム機能のUI選択にアクセスするための情報 ドキュメント内 に従いました。 $select.search
のように監視するカスタムディレクティブを作成します
myModule.directive('myUiSelect', function() {
return {
require: 'uiSelect',
link: function(scope, element, attrs, $select) {
scope.$watch('$select.search', function (search) {
if (search) {
...
}
});
}
};
});
次に、<ui-select my-ui-select>
タグにディレクティブを含めます。
NgInitを使用して値を取得し、
<div ui-select ng-init="mySelect = $select"></div>
<button ng-click="search(mySelect.search)">Search</button>
代わりに「mySelect」を見ることができます
$scope.$watch('mySelect.search', function(newVal){
alert(newVal);
});