Angular -UI typeahead: показать метку, но привязать только к значению

Я использую Angular -UI typeahead следующим образом:

<input type="text" ng-model="myModel" typeahead="o.value as o.text for o in options | filter:$viewValue | limitTo:5" typeahead-editable="false" />

привязан к модели вроде:

var options = [
    {"value": 1, "text": "value1"},
    {"value": 2, "text": "value2"},
    ...
];

Он правильно показывает текст параметров, но когда я выбираю элемент, он показывает внутри текстового поля значение. Модель правильно ограничена только значением (а не всем объектом модели).

Можно ли отобразить внутри текстового поля "текст" (а не "значение" ) после выбора, сохраняя привязку модели только к значению (т.е. когда я выбираю определенный "текст", модель обновляется с помощью "значение" )?

Ответ 1

Это не идеально, но атрибут typeahead-input-formatter обеспечивает обход, пока не будет предоставлено исправление. (Plunker из 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)" 
/>

Функция контроллера 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;
     }
   }
};

Ответ 2

Попробуйте изменить свой код из

typeahead="o.value as o.text for o in options | filter:$viewValue | limitTo:5"

to

typeahead="o as o.text for o in options | filter:$viewValue | limitTo:5"

Ответ 3

Вы можете попробовать сделать так, как было предложено, но с помощью typeahead-on-select, например,

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

Это обеспечит отображение текста или метки, но базовое значение будет изменено.

Ответ 4

Здесь сокращенное форматирование для всех, кто использует lodash или подчеркивание:

function formatTypehead(array,id){
  var o = _.find(array,{id:id});
  return (o?o.displayName || id:id);
}

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

Ответ 5

Хорошо, до сих пор я нашел возможное решение через директивы.

HTML

<div my-autocomplete my-autocomplete-source="element" my-autocomplete-model="obj[element.model]"></div>

ДИРЕКТИВА

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; 
            });
        }
    };  
});

Ну... очевидно, это всего лишь трюк... Я хотел бы знать, есть ли более чистый, более естественный способ сделать это... без изменения кода или использования директивы...

Ответ 6

для меня это:

uib-typeahead="o as o.RagioneSociale for o in main.getLocation($viewValue)"

вместо:

typeahead="o as o.RagioneSociale for o in main.getLocation($viewValue)"

был действительно полезен

У меня был json, сделанный вот так:

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

и это закончилось тем, что у него появилось выпадающее меню с только значением RagioneSociale и модель, в которой я могу видеть как текст, так и идентификатор и печатать их с помощью обычного {{asyncSelected}}