rappel angulaire de type ui-bootstrap sur selectMatch?

92

J'utilise la tête de frappe angulaire ui-bootstrap et je voudrais l'utiliser comme moyen de choisir de nombreux choix, donc j'aurais besoin d'obtenir la valeur sélectionnée lorsque la méthode selectMatch est lancée mais je ne trouve pas comment faire que dans mon contrôleur

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

Si je regarde la valeur sélectionnée, je reçois le changement chaque fois qu'une touche est enfoncée ...

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

J'ai compris que la méthode selectMatch est celle qui est appelée lorsque l'utilisateur appuie sur Entrée ou clique sur la liste mais je ne sais pas comment avoir un rappel à ce sujet ...

Merci !

mchasles
la source

Réponses:

250

Il y a une meilleure façon de faire cela maintenant. Une nouvelle méthode de rappel a été ajoutée

Dans le fichier du contrôleur, ajoutez ce qui suit:

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

En vue, ajoutez ce qui suit:

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

Voir la spécification de la tête de frappe pour plus d'informations (recherchez onSelect).

Vérifiez si les URL suivantes aident 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/

Mat
la source
2
Merci! A fonctionné comme un charme. Cela devrait probablement être officiellement documenté sur la page de référence sous l'en-tête Typeahead
ariestav
29
Quelqu'un at-il une idée de ce que sont réellement les objets $ item $ model $ label dans ce callback typeahead-on-select = 'onSelect ($ item, $ model, $ label)'?
AardVark71
@Matt, y a-t-il de toute façon que nous pouvons faire un postback en utilisant $ http avec l'événement onSelect?
Pratik Gaikwad
15
@ AardVark71 $ item $ model $ label ces trois propriétés sont comme ci-dessous respectivement. Si vous liez un tableau JSON d'objets ayant plus d'une propriété, vous obtiendrez l'élément sélectionné dans $ item avec toutes les propriétés. $ model est un modèle angulaire intégré utilisé qui stockera l'élément sélectionné.value et $ lable vous donnera la valeur affichée dans la zone de texte après la sélection. Donc, en peu de temps, $ label sera égal à $ model. J'espère que cela clarifie votre doute.
Pratik Gaikwad
16
@ AardVark71 Il est plus facile d'expliquer si l'expression est comme: state.id as state.name for state in states. Dans ce cas $itemest state, $ modèle state.id, et $labeleststate.name
Aximili
10

Edit: cette méthode n'est pas la meilleure actuellement. Il est préférable d'utiliser le rappel onSelect comme expliqué dans la réponse ci-dessus.

J'ai trouvé comment faire ce que je voulais. J'ai vu qu'il existe un attribut typeahead-editable et s'il est défini sur false, la valeur sélectionnée ne change que lorsqu'une valeur du modèle est sélectionnée. Et donc la $ watch fonctionne bien pour vérifier quand une nouvelle valeur est sélectionnée.

<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);
     });
}
mchasles
la source
2

Le code suivant devrait être votre code 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)' />

ajoutez simplement tête sur sélection dans la balise d'entrée avec la fonction de rappel.

La suite irait à l'intérieur du contrôleur

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

dans $ item, vous obtiendrez tout l'objet que vous avez passé dans le tableau principal de la liste de suggestions

Sandeep Gantait
la source
0

essayez ce qui suit avant la validation

 modelCtrl.$setValidity('editable', true);
Mohamed.Abdo
la source