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