açısal ui-bootstrap typeahead geri arama selectMatch?


92

Açısal ui-bootstrap türünü önceden kullanıyorum ve bunu birçok seçeneği seçmenin bir yolu olarak kullanmak istiyorum, bu yüzden selectMatch yöntemi başlatıldığında seçilen değeri almam gerekiyor ancak nasıl yapılacağını bulamıyorum bu benim kontrolörümde

<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">

Seçilen değeri izlersem, bir tuşa her basıldığında değişikliği alırım ...

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

SelectMatch yönteminin, kullanıcı enter tuşuna bastığında veya listeyi tıkladığında çağrılan yöntem olduğunu anladım, ancak bu konuda nasıl geri arama yapılacağını bilmiyorum ...

Teşekkürler !

Yanıtlar:


251

Bunu yapmanın daha iyi bir yolu var. Yeni bir geri arama yöntemi eklendi

Denetleyici dosyasında aşağıdakileri ekleyin:

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

Görünümde aşağıdakileri ekleyin:

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

Daha fazla bilgi için önden okuma özelliklerine bakın (onSelect için arayın).

Aşağıdaki URL'lerin http://www.techguides.in/how-to-create-autocomplete-using-angularjs-ui/ yardımcı olup olmadığına bakın

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


2
Teşekkürler! Bir cazibe gibi çalıştı. Bu muhtemelen resmen typeahead başlığı altında referans sayfasında belgelenmelidir: angular-ui.github.io/bootstrap
ariestav

29
$ İtem $ model $ label nesnelerinin gerçekte o geri arama tipinde-on-select = 'onSelect ($ item, $ model, $ label)' içinde gerçekte ne olduğu hakkında bir fikri olan var mı?
AardVark71

@Matt, onSelect olayıyla $ http kullanarak geri gönderme yapabileceğimiz bir yol var mı?
Pratik Gaikwad

15
@ AardVark71 $ item $ model $ label bu üç özellik sırasıyla aşağıdaki gibidir. Birden fazla özelliğe sahip nesnelerin JSON dizisini bağlıyorsanız, tüm özelliklerle $ item içinde seçili öğeyi alacaksınız. $ model, seçilen item.value ve $ lable'ın saklanacağı dahili açısal modeldir, seçimden sonra metin kutusunda görüntülenen değeri verir. Kısacası, çoğu zaman $ etiket $ model'e eşit olacaktır. Umarım bu şüphenizi açıklığa kavuşturur.
Pratik Gaikwad

16
İfadesi gibidir eğer AardVark71 @ Açıklaması kolaydır: state.id as state.name for state in states. Bu durumda $itemise state, $ modeldir state.idve $labelbirstate.name
Aximili

10

Düzenleme: Bu yöntem şu anda en iyisi değil. Yukarıdaki cevapta açıklandığı gibi onSelect geri aramayı kullanmak daha iyidir.

İstediğimi nasıl yapacağımı buldum. Bir typeahead-editable özniteliği olduğunu gördüm ve eğer false olarak ayarlanmışsa, seçilen değer yalnızca modelden bir değer seçildiğinde değişir. Ve böylece $ watch, yeni bir değer seçildiğinde kontrol etmek için iyi çalışıyor.

<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

Aşağıdaki HTML kodunuz olmalıdır

 <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)' />

sadece geri arama işlevi ile giriş etiketine typeahead-on-select ekleyin .

Aşağıdaki denetleyicinin içine girecek

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

$ item içinde, öneri listesinin ana dizisinde geçirdiğiniz tüm nesneyi alacaksınız


0

doğrulamadan önce aşağıdakileri deneyin

 modelCtrl.$setValidity('editable', true);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.