#angular #typescript #angular7
#angular #typescript #angular7
Вопрос:
Я столкнулся с проблемой при использовании библиотеки Angular mention.
Вот мой код на typescript.
items: Object[] = ["jay","roy","gini","rock","joy","kiya"];
Я использую этот определенный именованный items
массив в моем component.html file
<input type="text" id="cname" name="cname" placeholder="Type Here.." [mention]="items">
таким образом, он создает текстовое поле и выдает предложение, когда я набираю любое имя пользователя.
Предположим, я набираю @j
, тогда он предложит все имена, начинающиеся с имени j
, и после ввода оно будет введено в текстовое поле со знаком @
. Таким образом, в основном это предоставляет функциональность автоматического поиска по массиву, и для этого я импортировал библиотеку упоминания в мое приложение Angular7.
Я разрабатываю проект, в котором все пользователи приходят из веб-службы. Итак, мне нужно сохранить этих пользователей в этот items
именованный массив.
Формат JSON выглядит следующим образом.
[
{
"attributes": {
"User": "jay"
}
},
{
"attributes": {
"User": "roy"
}
},
{
"attributes":{
"User": "kiya"
}
},
{
"attributes":{
"User": "gini"
}
},
{
"attributes": {
"User": "rock"
}
},
{
"attributes": {
"User": "joy"
}
}
]
Приведенные выше данные JSON поступают с веб-сервера, и я сохраняю их в переменной. Итак, я хочу сохранить это в указанном выше массиве с именем items
, чтобы в моем текстовом поле при вводе он мог автоматически запрашивать реальные данные.
Я пробовал эту штуку, но во время ввода в текстовое поле она не дает никаких предложений.
Комментарии:
1. Вы определили переменную с именем
items
какObject[]
, что означает массив объектов. Затем вы инициализируете эту переменную значением,["jay","roy","gini","rock","joy","kiya"];
которое представляет собой массив строк (string[]
). Это не имеет смысла2. «Я пробовал эту вещь» … что вы пробовали? Я не вижу логики, при которой вы сопоставляете json из вашего веб-сервиса со строкой[].
3. @RyanE. пользователей, которых я получаю с сервера, я сохранил в переменной, используя вызов службы, а затем сопоставил элементы с этой переменной, но при таком подходе я не смог получить предложение при наборе текста. это то, что я пробовал.
4. Я оставил ответ. Если это не поможет, можете ли вы ответить тем, что вы пробовали? Возможно, angular не обнаруживает изменения в массиве объектов, поскольку Angular будет просматривать ссылку, и если ссылка не изменится, то он не отправит обновленный массив в директиву.
5. @JayeshVyas Попробуйте использовать mentionConfig , как я сказал в своем ответе.
Ответ №1:
Если вам нужна помощь в сопоставлении результата вашего веб-сервиса со строковым массивом, что-то вроде этого должно сработать.
Обновленный ответ для последней версии json.
this.myWebService.myWebServiceMethod.subscribe(result => {
this.items = result.map(item => {
return item.attributes.User;
}
}
Как указывает @abd995, при использовании этого метода могут возникнуть проблемы с производительностью, поскольку вы выполняете цикл по массиву. Помните, как часто вы выполняете приведенный выше код. Если ваш массив относительно невелик, то беспокоиться особо не о чем, но если у вас более 5 тысяч записей, возможно, вам захочется подумать об обновлении вашего API, чтобы возвращать данные в лучшем формате, которым вам не придется манипулировать.
Комментарии:
1. Если массив большой, циклический просмотр набора данных не рекомендуется, поскольку это приведет к проблемам с производительностью. Особенно когда ‘mention’ будет работать с массивами объектов.
2. @abd995 Наверняка. Но если бы библиотека не поддерживала этот тип конфигурации, у вас не было бы другого выбора, кроме как преобразовать в массив строк. Или обновите свой серверный сервер, чтобы возвращать массив строк.
Ответ №2:
Пожалуйста, добавьте mentionConfig, когда элементы представляют собой массив объектов. Поле объекта, которое должно использоваться в качестве метки, должно быть указано в качестве labelKey в конфигурации упоминания следующим образом.
<input type="text" [mention]="items" [mentionConfig]="{ labelKey:'User'}">
Обновить
Поскольку вопрос был обновлен с использованием массива объектов с двумя вложенными свойствами, mentionConfig не может быть использован, поскольку mention поддерживает только максимум один уровень вложенного свойства. Проверьте исходный код упоминания здесь. Я также поднял проблему в github по этому поводу. Итак, в этом случае нам пришлось бы создать массив меток из object array следующим образом.
items = items.map((item) => item.attributes.User);
Комментарии:
1. Это также потребовало бы от автора установить ответ веб-сервера непосредственно для элементов[]. Возможно, именно это они и делают, хотя вопрос не приводит вас к такому выводу.
2. Ах, неважно, я вижу, где они говорят «Итак, я хочу сохранить это в указанном выше массиве с именем items». Я думаю, что я был сбит с толку, потому что начальные значения были строками. Я также не ожидал, что в библиотеке будет переменная типа config, которая позволяет вам указывать ключ для объекта для просмотра. 1 для этого автора библиотеки
3. Hii, ваше решение работает должным образом, мне нужно от вас одно предложение, потому что я не знаю, как правильно использовать библиотеку mention в angular. если мой формат JSON изменится. Пожалуйста, посмотрите правку в моем посте, я обновил формат JSON. Я пробовал с [mention]=»items.attributes», а также с [mentionConfig]=»{labelKey: ‘User’}». Не могли бы вы, пожалуйста, подсказать, как я могу этого добиться?
4. @JayeshVyas Вы пробовали [mentionConfig]=»{ labelKey: ‘атрибуты. Пользователь’}»
5. @JayeshVyas Похоже, что mention не поддерживает свойства вложенных объектов в качестве labelKey. Это упомянутый исходный код , который устанавливает labelKey без учета возможности вложенных свойств объекта. Если это так, вам придется использовать тот же метод, упомянутый в ответе @Ryans. Создайте массив, используя map, подобный этому
items = items.map((x) => x.attributes.User)