При изменении значения в раскрывающемся поле я хочу сделать поле только для чтения. Насколько мне известно в программировании, мы устанавливаем поле только для чтения при привязке поля. Есть ли способ сделать поле только для чтения в зависимости от событий?
Как сделать поле динамически доступным только для чтения, т.е. по событиям xforms-value-changed и другим событиям?
Ответы (1)
Я бы предложил решение, которое не требует явных обработчиков событий: вы можете использовать два набора элементов управления, один из которых доступен только для чтения, а другой доступен для редактирования. Чтобы переключаться между обоими наборами, вы можете поместить каждый из наборов в xforms:group
с атрибутом ref
, который определяет, отображается ли группа или нет.
Вот пример с группами, ссылающимися на взаимоисключающие условия. В зависимости от значения узла экземпляра selectedvalue
отображается одна из групп. Если набор элементов select1 сложнее, чем просто 1 или 0, вам придется адаптировать XPath атрибутов xforms:group@ref
.
<xforms:select1 appearance="minimal" ref="instance('main')/path/to/selectedvalue">
...
</xforms:select1>
<xforms:group ref="instance('main')/path/to/selectedvalue eq 1">
<xforms:input ref="instance('main')/path/to/textinput" />
<!-- more editable XForms controls, bound to main instance -->
</xforms:group>
<xforms:group ref="instance('main')/path/to/selectedvalue eq 0">
<xforms:input ref="instance('read-only')/path/to/textinput" />
<!-- more read-only XForms controls, bound to a read-only instance -->
</xforms:group>
Это решение имеет то преимущество, что обработка событий вообще не требуется (или, точнее, механизм XForms сам выполняет часть обработки событий; xforms:group
сами действуют как «слушатели событий» для значения экземпляра). Также возможно комбинировать этот метод с явной обработкой событий: используя xforms:action ev:event="xforms-value-changed"
, который выдает xforms:setvalue ...
на узле, наблюдаемом атрибутами xforms:group@ref
.