J'utilise Angular-UI typeahead de la manière suivante:
<input type="text" ng-model="myModel" typeahead="o.value as o.text for o in options | filter:$viewValue | limitTo:5" typeahead-editable="false" />
lié à un modèle comme:
var options = [
{"value": 1, "text": "value1"},
{"value": 2, "text": "value2"},
...
];
Il affiche correctement le texte des options, mais lorsque je sélectionne un élément, il affiche à l'intérieur de la zone de texte la valeur. Le modèle est correctement limité à la valeur uniquement (pas à l'ensemble de l'objet modèle).
Est-il possible d'afficher à l'intérieur de la zone de texte le "texte" (pas la "valeur") après la sélection, tout en maintenant la liaison du modèle à la seule valeur (c'est-à-dire: lorsque je sélectionne un certain "texte" le modèle est mis à jour avec la "valeur") )?
Ce n'est pas idéal, mais l'attribut typeahead-input-formatter fournit une solution de contournement jusqu'à ce qu'un correctif puisse être fourni. ( Plunker à partir de github thread).
HTML:
<input type="text"
ng-model="myModel"
typeahead="o.value as o.text for o in options | filter:$viewValue | limitTo:5"
typeahead-editable="false"
typeahead-input-formatter="formatLabel($model)"
/>
Fonction du contrôleur AngularJs:
$scope.formatLabel = function(model) {
for (var i=0; i< $scope.options.length; i++) {
if (model === $scope.options[i].value) {
return $scope.options[i].text;
}
}
};
Essayez de changer votre code de
typeahead="o.value as o.text for o in options | filter:$viewValue | limitTo:5"
à
typeahead="o as o.text for o in options | filter:$viewValue | limitTo:5"
Vous pouvez essayer de faire comme suggéré, mais avec typeahead-on-select comme
<input type="text"
ng-model="myModel"
typeahead="o as o.text for o in options | filter:$viewValue | limitTo:5"
typeahead-editable="false"
typeahead-on-select="model=$item.value"
/>
Cela garantira que le texte ou l'étiquette est affiché mais que la valeur sous-jacente est modifiée.
Voici un formateur de sténographie pour tous ceux qui utilisent lodash ou underscore:
function formatTypehead(array,id){
var o = _.find(array,{id:id});
return (o?o.displayName || id:id);
}
et html:
<input type="text"
uib-typeahead="s.id as s.displayName for s in companies | filter:$viewValue | limitTo:8"
typeahead-input-formatter="formatTypehead(companies, $model)"
ng-model="model.company"
>
Eh bien, jusqu'à présent, j'ai trouvé une solution possible grâce à des directives.
HTML
<div my-autocomplete my-autocomplete-source="element" my-autocomplete-model="obj[element.model]"></div>
DIRECTIF
app.directive('myAutocomplete', function() {
return {
restrict: 'A',
replace: true,
template: '<input type="text" name="{{myAutocompleteSource.model}}" placeholder="{{myAutocompleteSource.label}}" ng-model="selected" typeahead="o as o.text for o in myAutocompleteSource.options | filter:$viewValue | limitTo:5" typeahead-editable="false" />',
scope: {
myAutocompleteSource: '=',
myAutocompleteModel: '='
},
controller: function($scope) {
$scope.selected = null;
$scope.$watch('selected', function() {
$scope.myAutocompleteModel = ($scope.selected && 'value' in $scope.selected) ? $scope.selected.value : null;
});
}
};
});
Eh bien ... évidemment, ce n'est qu'une astuce ... J'aimerais savoir s'il existe un moyen plus propre et plus naturel de le faire ... sans modifier le code ou utiliser la directive ...
pour moi ceci:
uib-typeahead="o as o.RagioneSociale for o in main.getLocation($viewValue)"
au lieu de:
typeahead="o as o.RagioneSociale for o in main.getLocation($viewValue)"
était vraiment utile
j'ai fait un json comme ça:
[{"RagioneSociale":"Politi Real Estate sas","IDAnagrafica":"2516"},{"RagioneSociale":"COND METROPOLITAN","IDAnagrafica":"4325"}]
Model: {{asyncSelected | json}}
<input type="text" ng-model="asyncSelected" uib-typeahead="o as o.RagioneSociale for o in main.getLocation($viewValue)" typeahead-loading="loadingLocations" typeahead-no-results="noResults" class="form-control">
et cela a abouti à quelque chose comme avoir le menu déroulant avec juste la valeur RagioneSociale et un modèle où je peux voir à la fois le texte et l'identifiant et les imprimer avec un {{asyncSelected}} normal