Механизм меток / данных в "OO.ui.ComboBoxInputWidget"

OOjs UI's OO.ui.ComboBoxInputWidget позволяет установить массивOO.ui.MenuOptionWidget объекты в его menu.items поле конфигурации. Такой предмет может иметь label и data поле. data поле может быть типа object [1].

Теперь, если я использую data поле типаobject значениеOO.ui.ComboBoxInputWidget будет "[Object object]"как он пытается разыграть data значение в строке, когда пользователь выбирает элемент опции. Так выглядит OO.ui.ComboBoxInputWidget позволяет только data типаstring в его вариантах. Это верно?

Это также означает, что в самом поле ввода отсутствует механизм "метка / данные". Если у меня есть следующие варианты

[
  { label: "Rot", data: "red" },
  { label: "Gelb", data: "yellow" },
  { label: "Grün", data: "green" }
]

и пользователь выбирает опцию с меткой "Gelb", поле ввода показывает "желтый", а не "Gelb". Пример кода в официальной документации демонстрирует это поведение [2]. Я что-то пропустил? Можно ли показатьlabel пользователю, но получить data (объект) при звонкеgetValue на таком поле?

[1] https://doc.wikimedia.org/oojs-ui/master/js/

[2] https://doc.wikimedia.org/oojs-ui/master/js/


Этот вопрос был первоначально размещен на wikitech-l список рассылки. Вы можете найти ветку здесь: http://markmail.org/message/fesegc3yljqcytzt

2 ответа

Как правило, свойство data для элементов внутри GroupElement это могут быть строки или объекты, так как они представляют состояние вашего элемента. В OO.ui.mixin.GroupElement, метод getItemFromData может затем вернуть определенный элемент на основе его свойства данных. Если вы используете объект для данных, OOjs-UI будет использовать его OO.getHash() в основном, чтобы привести в порядок ваш объект, чтобы он мог убедиться, что он получает правильный.

Свойство "данные" фактически проходит всю цепочку иерархии от OO.ui.Element (если вы посмотрите на этот метод, описание этого параметра одно и то же) - и на этом уровне он определенно допускает любые данные, будь то строка или объект.

Однако при работе с конкретными случаями, например, ComboBoxInputWidget (терминология "входной виджет" обычно предполагает что-то внутри формы в OOjs-UI), означает, что размещение данных как объекта обычно не имеет смысла. Если ваш вариант использования не требует чего-то совсем другого, мы обычно хотим, чтобы ComboBoxInputWidget имел пару "value" => "label", поэтому он использует свое свойство "data" в качестве "value" и ожидает строку.

Что касается второй части вашего вопроса, я не уверен на 100%, что я понял это (пожалуйста, исправьте меня, если так), но насколько я понимаю, если вы установите элементы OO.ui.MenuOptionWidget с их данными в качестве значения ('red' / 'yellow' / 'green'и т. д.) и метку как mw.msg, которую видит пользователь, тогда он должен работать "из коробки".

Поэтому, если вы посмотрите на пример, приведенный в документации для ComboBoxInputWidget, вы можете установить для данных вашего элемента цвет (значение), а для метки - слово, которое вы хотите отобразить, а когда пользователь выбирает параметр, метка должна отображаться в ComboBoxInputWidget.

Имейте в виду, однако, что если вы слушаете событие "выбрать" или "выбрать" из этого входного виджета, вы получите выбранный элемент, поэтому, если вы проецируете этот выбор на какой-то другой вход, вы должны запросить метку (item.getLabel()) а не данные.

Спасибо за ваши объяснения.

Похоже, что OOUI не поддерживает что-то подобное (пока).

Пример: у вас есть значение параметра "Q7186" и значение метки "Мария Кюри". Когда пользователь выбирает "Marie Curie", пользовательский интерфейс скажет: "Q7186". Пользователь может быть сбит с толку.

Я знаю, что некоторые пользовательские интерфейсы обрабатывают это, показывая label выбранного элемента пользователю в элементе DIV или что-то еще и сохранение фактического значения во внутренней переменной. Когда дело доходит до представления формы и необходимости предоставления фактической "строки значения", они используют скрытое поле и, возможно, valueField опция конфигурации, если "значение" - это не строка, а объект (что позволяет установить строковое значение скрытого поля из поля в объекте значения).

Может быть, это что-то для будущего развития.

Другие вопросы по тегам