Что я сделал, чтобы сломать мои xForms? - PullRequest
0 голосов
/ 17 ноября 2008

Я изучаю xForms, но, видимо, недостаточно хорошо, потому что не могу понять, почему этот код не работает.

Анализируется в FF2 с расширением xForms, но не отображает элементы управления формы. IE7 и X-Smiles доставляют мне разные проблемы, но я не уверен, что эти проблемы возникают из-за моих xForms или из-за чего-то еще - пока я не заработаю в FF2, я не могу точно сказать.

Ответы [ 4 ]

2 голосов
/ 17 мая 2009

К сожалению, этот документ содержит массу проблем, я рассмотрим каждую из них по очереди.

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 из-за ограничений браузера.

0 голосов
/ 17 ноября 2008

Я добавлю, что xf: repeat, xf: group, xf: input, ... не могут быть потомками xf: model

0 голосов
/ 27 апреля 2009

Хорошее место для начала может быть валидатор XForms . После этого я бы порекомендовал начать с рабочего примера и постепенно добавлять свой код, чтобы увидеть, какая часть не работает.

0 голосов
/ 17 ноября 2008

Вы не должны размещать свои модели в разделе тела. Вместо этого все определения модели должны быть в разделе заголовка. Как и сейчас, ваш код не соответствует стандарту и его очень сложно понять.

Вики-книга Xforms - хороший ресурс для изучения XForms.

...