У меня проблема с моим кодом на данный момент, поэтому, если я создаю новый чип, он попадает на мою модель ярлыка и создает имя и идентификатор.Угловой материал + TypeScript: Auto-complete + опция выбора
Однако, когда я печатаю, чтобы выбрать возвращаемый параметр, если я нажму на эту опцию, он вернет объект, а не имя метки.
Вот скриншот интерфейса, где выпадающий который появляется md-autocomplete
возвращает имя, новый ярлык создается только с именем, которое отображается, но при нажатии на hotel
возвращается {"id":1,"name":"hotel"}
.
Моя проблема заключается в том, что я хочу вернуть только имя и не знаю, где мне нужно сделать изменение, чтобы сделать это.
UI:
labels.html:
<md-content layout="column">
<md-chips ng-model="cont.vm.selectedLabels" md-autocomplete-snap md-require-match="false"
md-on-append="cont.createLabel($chip)">
<md-autocomplete
md-selected-item="cont.vm.selectedItem"
md-search-text="searchText"
md-items="item in cont.querySearch(searchText)"
md-item-text="item.name"
md-min-length="2"
placeholder="Type to add a label">
<span md-highlight-text="cont.vm.searchText" >{{item.name}}</span>
<md-not-found>
No matches found.
</md-not-found>
</md-autocomplete>
<md-chip-template>
<span>
<strong>{{$chip.name}}</strong>
</span>
</md-chip-template>
</md-chips>
<br />
<p class="md-title">Existing Labels</p>
<md-list>
<md-list-item class="md-2-line label-option" ng-repeat="label in cont.vm.labels" layout="row"
layout-wrap>
<div class="md-item-text md-whiteframe-z1" flex>
<h3>(NAME: {{label.name}}) (ID: {{label.id}})</h3>
</div>
</md-list-item>
</md-list>
</md-content>
labelsController.ts:
constructor(private $scope: common.IScope<LabelScope>,
private labelsService: ILabelsService){
super($scope);
this.vm.labels = this.loadLabels();
this.vm.selectedLabels = [];
this.vm.selectedItem = null;
this.vm.searchText = null;
console.log($scope);
}
private loadLabels() {
return this.labelsService.getLabels();
}
// Returns list of labels that already exists
public querySearch (query: string) {
var results = query ? this.loadLabels() : [];
return results;
console.log(results);
}
// Returns name + ID on new chip created
public createLabel($chip: string) {
return {
name: $chip,
id: 4
};
}
labelsService.ts:
private mockLabels: Array<Label> = [
new Label(1, 'hotel'),
new Label(2, 'sport'),
new Label(3, 'gaming'),
new Label(4, 'apple'),
new Label(5, 'retail')
];
public getLabels() {
return this.mockLabels;
console.log(this.mockLabels);
}
Mate, вы только что спасли меня часов работы! Я понятия не имел, что '' md-on-append''' был вызван при выборе элемента! Большое спасибо! У меня есть последний вопрос, однако. Как бы я затем улучшить этот код, чтобы предотвратить выбор «отеля» не один раз? То есть. Как предотвратить повторное использование пользователем тега? –
Это ошибка. Это не позволяет вам дважды щелкнуть и вставить один и тот же тег из-за уникальности идентификатора. –
@ RyanDrake Ха-ха. Я потратил несколько часов на то, чтобы выяснить то же самое. Я рад, что смог сэкономить ваше время. И ответ на ваш второй вопрос, я тоже столкнулся с этой проблемой. в 'md-on-append' применяют' angular.forEach' в массиве микросхем и проверяют, существует ли этот элемент, а затем сплайсируем этот элемент. а затем вернуть один и тот же элемент. Другого варианта нет. –