Kotlin классы, не идентифицированные как Flink действительные POJO

Как упоминалось в комментариях, похоже, что вы хотите получить id выбранного option, а не select. Один из способов получить это - использовать свойство selectedIndex для select в сочетании с его коллекцией options (вы также можете использовать selectedOptions[0] , среди других методов).

Я взял на себя смелость «исправить» некоторые соглашения об именах; как правило, начальные буквы в верхнем регистре обозначают конструктор объекта, а не просто функцию или переменную. Кроме того, используя var (или let или const, в зависимости от необходимости) до назначения переменной, по умолчанию она не становится глобальной переменной. Было сделано несколько других незначительных исправлений, которые я вам отдам.

function showDiv(nameSelect) {

  console.log(nameSelect);
  if (nameSelect) {

    var selectedOption = nameSelect.options[nameSelect.selectedIndex];
    var name = selectedOption.id;
    var splitName = name.split('_');

    console.log(splitName[1]);
    var idOfSection = splitName[0] + '_' + splitName[1];

    var optionValue = selectedOption.value;
    if (optionValue == nameSelect.value) {
      document.getElementById(idOfSection).style.display = "block";
    } else {
      document.getElementById(idOfSection).style.display = "none";
    }
  } else {
    // Commenting this out, since splitName will be undefined in this branch...
    //document.getElementById(splitName[0] + splitName[1]).style.display = "none";
  }
}















1
задан randomstate42 18 January 2019 в 20:04
поделиться

1 ответ

Я вижу как минимум два нарушения правил POJO с указанным классом данных.

1) У класса есть открытый конструктор без аргументов

По умолчанию Kotlin не будет генерировать перегрузки для функций со значениями параметров по умолчанию ( https://kotlinlang.org/docs/reference/ java-to-kotlin-interop.html # overloads-generation )

Таким образом, ваш скомпилированный класс будет иметь только один конструктор с двухпараметрическим конструктором, и конструктор без аргументов не будет создан. Чтобы заставить компилятор Kotlin генерировать множественные перегрузки, нужно использовать аннотацию @JvmOverloads. В вашем случае это будет использоваться в конструкторе, поэтому нам также нужно добавить ключевое слово constructor:

data class SomeDataClass @JvmOverloads constructor

2) Все нестатические, не переходные поля в классе являются либо общедоступными (и не final) или иметь общедоступные методы получения и установки, которые следуют соглашениям об именах Java-бинов.

Поскольку вы используете ключевые слова val, сгенерированные поля будут final, и для них не будет сгенерировано никакого установщика. Таким образом, вы можете изменить val на var с, и поля больше не будут final, а также будут генерироваться правильные методы получения и установки. (Или вы можете использовать другую аннотацию, чтобы предотвратить создание геттеров и сеттеров и выставить поле таким, как оно есть https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields ])

Таким образом, окончательный код должен быть таким:

data class SomeDataClass @JvmOverloads constructor(
    var topic: String = "",
    var message: String = ""
)
0
ответ дан Alexander Mironov 18 January 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: