Манипулирование повторяющимися коллекциями Xforms.Вид и модель легко выйти из синхронизации - PullRequest
0 голосов
/ 23 сентября 2018

Чтобы воссоздать эту проблему, вот пример кода, взятого из руководства Steve Pembertons Xforms для авторов HTML.

После нескольких случайных нажатий кнопок «Создать» и «Удалить» пользовательский интерфейс остановится и перестанет реагировать на дальнейшие нажатия, поскольку модель вышла из синхронизации с представлением (т. Е. Они отражают различное количество экземпляров повторяющейся конструкции)

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?>
<?xsltforms-options debug="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://www.w3.org/1999/xhtml"
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
<head>
	<title>To do</title>

	<style type="text/css">
	  body { font-family: sans-serif}
	  label { display: inline-block; width: 3em; margin: 0 1em }
          .xforms-repeat-item-selected { background: yellow}
	</style> 

	<xf:model>
   		<xf:instance src="todo.xml"/>
		<xf:instance id="template">
			<items xmlns="">
				<todo><task/><status>unstarted</status><date/></todo>
			</items>
		</xf:instance>
   		<xf:submission id="save" method="put" action="todo.xml" replace="none"/>
   		<xf:bind nodeset="todo/date" type="xsd:date"/>
	</xf:model>
</head>
<body>
    <xf:group>
	<xf:repeat nodeset="todo" id="todo-repeat">
	   <xf:input ref="date"><xf:label>Date</xf:label></xf:input>
	   <xf:select1 ref="status" selection="open">
	      <xf:label>Status</xf:label>
	      <xf:item><xf:label>Not started</xf:label><xf:value>unstarted</xf:value></xf:item>
	      <xf:item><xf:label>In Progress</xf:label><xf:value>started</xf:value></xf:item>
	      <xf:item><xf:label>Done</xf:label><xf:value>finished</xf:value></xf:item>
	   </xf:select1>
	   <xf:input ref="task"><xf:label>Task</xf:label></xf:input>
	   <xf:trigger>
	      <xf:label>Delete</xf:label>
	      <xf:delete ev:event="DOMActivate" nodeset="." at="1" />
	   </xf:trigger>
	</xf:repeat>
    </xf:group>
    <xf:trigger>
       <xf:label>New</xf:label>
       <xf:action ev:event="DOMActivate">
	    <xf:insert context="/items" origin="instance('template')/todo" nodeset="todo" position="after" at="count(todo)"/>
	    <xf:setvalue ref="todo[last()]/date" value="substring-before(now(), 'T')"/>
       </xf:action>
    </xf:trigger>
    <xf:submit submission="save"><xf:label>Save</xf:label></xf:submit>
</body>
</html>

1 Ответ

0 голосов
/ 30 сентября 2018

Эта проблема обнаружена: это связано с обработкой события для уже удаленного объекта HTML.На самом деле, удаление последнего повторяющегося элемента достаточно для его воспроизведения.После этого, даже если движок XLSTForms изменен, некоторое выполнение Javascript остается возможным, вызывая все проблемы ...

По-видимому, это происходит только с последними выпусками Chrome, и в консоли появляется исключение в источнике Javascript, указывающее, что нетЭлемент был найден для события.

Игнорирование этих событий зомби звучит здорово!Это было успешно протестировано во всех последних браузерах, и оно будет зафиксировано как можно скорее.

-Alain

...