Генерация правильного JSON с p-раскрывающимся списком PrimeNG - PullRequest
0 голосов
/ 02 ноября 2018

Я новичок в Angular, и у меня следующая ситуация с использованием API в Java:

У меня есть class Release, где категория НЕ обязательна (категория класса).

@Entity
@Table (name = "release")
public class Release {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String description;

    @ManyToOne
    @JoinColumn (name = "id_category")
    private Category;

    (...)
}

Когда я регистрирую релиз на странице, созданной в Angular с использованием REST API, я отправляю json этому API следующим образом:

{"description": "test", "category": {}}

из-за того, что не сообщили категории. Но мой API возвращает следующую ошибку (в Java):

TransientObjectException - объект ссылается на несохраненный переходный процесс instance - сохранить временный экземпляр перед сбросом

Я выполнил тест в Почтальоне и отправил json следующим образом, чтобы зарегистрировать релиз:

{"description": "test"}

Таким образом я могу зарегистрироваться, тогда возникает сомнение:

Ошибка в Angular, который использует p-dropdown компонент PrimeNG следующим образом:

    <p-dropdown placeholder = "Select ..." [autoWidth] = "false"
      [filter] = "true" [options] = "categories"
      [(ngModel)] = "release.category.id" name = "category"
      #category = "ngModel"> </ p-dropdown>

или ошибка в объявлении категории в выпуске класса?

Когда вы регистрируете релиз, информирующий о категории, ошибок нет, и json отправляется следующим образом:

{"description": "test", "category": {"id": 1}}

Спасибо!

1 Ответ

0 голосов
/ 04 ноября 2018

В любом случае p-раскрывающиеся опции принимают Array, и здесь вы возвращаете объект

{"description": "test", "category": {}}

должно быть

{"description": "test", "category": [{"name":"John", "id": "1"},{"name":"Kan", "id": "2"}]}

Чем он примет массив в качестве опции.

и вы должны использовать свойство optionLabel, чтобы определить, какой ключ вы хотите отображать в списке.

<p-dropdown placeholder = "Select ..." [autoWidth] = "false"
  [filter] = "true" [options] = "categories"
  [(ngModel)] = "release.category.id" name = "category"
  #category = "ngModel" [optionLabel]="name"> </ p-dropdown>

в этом случае ваш ngModel будет иметь целый объект, если пользователь выберет

{"name":"John", "id": "1"}

Если вы хотите, он возвращает одно значение «1», если пользователь выбирает Джона. чем нужно изменить опцию Array, как показано ниже:

[{"label":"John", "value": "1"},{"label":"Kan", "value": "2"}

Надеюсь, это поможет!

...