сохранить данные json в массив в Angular TypeScript

#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)