操作 Xforms 重复集合。视图和模型很容易不同步
Posted
技术标签:
【中文标题】操作 Xforms 重复集合。视图和模型很容易不同步【英文标题】:Manipulating Xforms repeat collections. View and Model easily get out of sync 【发布时间】:2019-02-27 05:35:36 【问题描述】:为了重现这个问题,这里有一些示例代码取自 Steve Pembertons Xforms for html authors tutorial。
随机点击几下新建和删除按钮后,UI 将冻结并停止响应进一步的点击,因为模型与视图不同步(即它们反映了不同数量的重复构造实例)
<?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】:此问题已被定位:这是由于对已删除的 HTML 对象的事件处理。实际上,删除最后一个重复项就足以重现它。之后,即使更改了 XLSTForms 引擎,仍然有可能执行一些 javascript 导致所有麻烦...
显然,这只发生在最近的 Chrome 版本中,并且 Javascript 源代码中的异常出现在控制台中,表明没有找到该事件的元素。
忽略那些僵尸事件听起来很棒!这已在所有最近的浏览器中成功测试,并将尽快提交。
-阿兰
【讨论】:
Alain 我不认为同步问题仅限于 Chrome,它不仅仅是删除最后一个重复项目的用例(实际上有时对我有用)。不过,我很乐意等待,看看下一个版本会出现什么。以上是关于操作 Xforms 重复集合。视图和模型很容易不同步的主要内容,如果未能解决你的问题,请参考以下文章