К сожалению, этот документ содержит массу проблем, я рассмотрим каждую из них по очереди.
1) Самая большая проблема возникает несколько раз и, похоже, связана с некоторой путаницей между model
и пользовательским интерфейсом. Эти два совершенно разных зверя в XForms, которые придерживаются шаблона проектирования модель-представление-контроллер. Поэтому вы должны помнить, что все в model
полностью отделено от всего в пользовательском интерфейсе. Отношения между ними просты: элементы управления пользовательского интерфейса могут связываться с узлами данных экземпляра в ваших model
s. Практически, с точки зрения вашего документа, это означает, что ваши элементы select1
и repeat
не должны быть потомками элементов model
. Только instance
, bind
и элементы действия могут быть потомками model
.
2) Вы используете несколько model
элементов, которые не нужны в такой простой форме (потому что каждый model
может содержать много instance
с и bind
с). Причина, по которой я отмечаю это, состоит в том, что вы вводите пару потенциальных ловушек, используя несколько model
с, которых лучше всего избегать, придерживаясь одного model
, где это возможно. Например, функция instance
XPath не будет работать в model
с, поэтому вы должны быть очень осторожны с зависимостями данных между ними. Кроме того, обновляется элемент управления пользовательского интерфейса, в соответствии с которым model
он связан, что часто вызывало у меня проблемы в прошлом, когда элементы управления явно не обновлялись.
3) Вы пытались использовать элемент repeat
, чтобы применить дочерний элемент bind
ко многим узлам. Это неправильно, потому что repeat
является элементом пользовательского интерфейса, а не элементом модели. Однако, поскольку bind
принимает атрибут nodeset
вместо атрибута ref
, на самом деле вам вообще не нужен repeat
. Вместо этого вы можете просто сделать это:
<xf:bind nodeset="//want" readonly="true()" />
4) На многих ваших элементах управления пользовательского интерфейса вы указываете как атрибут связывания, так и атрибут ref. Эти атрибуты являются взаимоисключающими, поскольку они представляют разные способы достижения одной и той же вещи. Атрибут ref должен содержать XPath, который идентифицирует экземплярный узел данных, с которым вы хотите связать элемент управления UI. Атрибут bind должен содержать идентификатор элемента bind, который был определен в другом месте (сам элемент bind идентифицирует узел, к которому в этом случае привязывается элемент управления, через его атрибут nodeset). Таким образом, используя оба атрибута в одном и том же элементе управления пользовательского интерфейса, вы противоречите себе.
5) В некоторых местах вы пытались использовать атрибут ref для привязки элемента управления к другому элементу в пользовательском интерфейсе. Элементы управления могут быть связаны только с данными экземпляра.
6) У вас есть setvalue
внутри repeat
, который вы пытаетесь вызвать на событии xforms-value-changed
. Это событие не отправляется элементу repeat
, поэтому ваш setvalue
никогда не будет вызван. Событие xforms-value-changed
отправляется только элементам управления основной формы, которые определены в спецификации XForms как:
вход | тайна | TextArea | Выход | Загрузка | Диапазон | триггер | отправить | выбрать | select1
7) В другом ответе на этот вопрос упоминается, что вы неправильно указали элементы model
в теле документа. К сожалению, у меня недостаточно репутации, чтобы комментировать, но я просто хотел отметить, что ответ на самом деле неверный. Хотя принято ставить элементы model
в документ head
, ничто в спецификации XForms не требует этого. Фактически, один из основных процессоров XForms, Ubiquity XForms , на самом деле требует model
с, чтобы быть в документе body
из-за ограничений браузера.