Нужна стратегия для поиска свойства динамически генерируемого выпадающего компонента - PullRequest
1 голос
/ 10 октября 2011

Мне нужно установить строку нулевого значения для компонента dropDownChoice.Значением по умолчанию для нулевого выбора является «Выбрать один», которое жестко закодировано в классе Wicket AbstractSingleChoice.

Обычный способ переопределить это - определить ресурс свойства.динамически генерируется во время выполнения и добавляется на панель (которая находится в пределах данных).DropDownChoice конкретно не упоминается в разметке.

Я ищу предложения о том, как программно переопределить строку нулевого значения по умолчанию в этой ситуации.Было бы хорошо, если бы у конструктора DropDownChoice был дополнительный параметр для этого.

Нужно ли программно создавать новый ресурс свойства?

Надеюсь, это имеет смысл.

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

Вы можете переопределить AbstractSingleSelectChoice.getNullKey() и AbstractSingleSelectChoice.getNullValidKey(), чтобы заставить Wicket получать локализованный ресурс из файла .properties или .xml, в котором идентификатор компонента не имеет часть ключа. Это задокументировано в этой проблеме JIRA: Открыть ключ интернационализации нулевого значения DropDownChoice

Например:

DropDownChoice ddc = new DropDownChoice(id, model, choices){
   @Override
   protected String getNullKey(){ return "customDdcNullValue"; }
   @Override
   protected String getNullValidKey(){ return "customDdcNullValue"; }
}

Извлечет текст <option> из свойства customDdcNullValue.

Эти методы, кажется, были добавлены в версии 1.4.4, если вы используете 1.3, вы всегда можете использовать IChoiceRenderer с DropDownChoice, который возвращает правильную строку в случае значения null. Обратите внимание, что вы можете извлечь его из ресурсов (с помощью getString() или StringResourceModel) или получить значение из базы данных / кэша, если это необходимо. Это может зависеть от того, как вы уже локализуете выбор для ненулевых значений.

Кроме того, вы можете использовать исходный код AbstractSingleSelectChoice.getDefaultChoice(), чтобы бросить свой собственный DropDownChoice с таким поведением.

ОБНОВЛЕНИЕ : Другой способ справиться с этим - предоставить собственное значение, представляющее null, или не выбирать. Просто не забудьте использовать setNullValid(false) на DropDownChoice, чтобы предотвратить появление null, когда есть выбранное значение, и инициализировать модель постоянного тока с вашим значением без выбора, когда вы все еще не знаете его значение, чтобы избежать Калибруй null при звонке getDefaultChoice().

При определении значения для опции без выбора обратите особое внимание на эту часть AbstractSingleSelectChoice.getDefaultChoice():

// Null is not valid. Is it selected anyway?
if ((selected == null) || getNoSelectionValue().equals(selected) ||
      selected.equals(EMPTY_STRING))
{

Примите во внимание, что getNoSelectionValue() возвращает -1, поэтому, пожалуйста, не используйте -1, или пустую строку, в качестве пользовательского значения NULL. Я научился этому нелегко, поверь мне, это не приятно.

0 голосов
/ 10 октября 2011

Вы должны использовать функцию локализации для достижения этой цели.Существует метод org.apache.wicket.resource.loader.IStringResourceLoader.loadStringResource(org.apache.wicket.Component,java.lang.String), который возвращает строковое значение для отображения для данного компонента.Строка будет ключом ресурса, для вашего случая это строка «nullValid», IIRC.Таким образом, вы можете реализовать свой собственный менеджер ресурсов, который будет выбирать данные из базы данных вместо .properties файлов.

...